This is page 84 of 94. Use http://codebase.md/cyfrin/aderyn?page={x} to view the full context.
# Directory Structure
```
├── .cargo
│ └── config.toml
├── .git-blame-ignore-revs
├── .gitattributes
├── .github
│ ├── images
│ │ ├── aderyn_logo.png
│ │ ├── poweredbycyfrinblack.png
│ │ └── poweredbycyfrinblue.png
│ ├── ISSUE_TEMPLATE
│ │ ├── bug_report.md
│ │ ├── false_positive_issue.md
│ │ └── feature_request.md
│ └── workflows
│ ├── cargo.yml
│ ├── dependencies.yml
│ ├── release.yml
│ ├── reports.yml
│ └── toml.yml
├── .gitignore
├── .gitmodules
├── .vscode
│ └── settings.json
├── aderyn
│ ├── Cargo.toml
│ ├── oranda.json
│ ├── README.md
│ ├── src
│ │ ├── birdsong.rs
│ │ ├── completions.rs
│ │ ├── lib.rs
│ │ ├── lsp.rs
│ │ ├── main.rs
│ │ ├── mcp.rs
│ │ └── panic.rs
│ └── templates
│ └── aderyn.toml
├── aderyn_core
│ ├── .gitignore
│ ├── Cargo.toml
│ ├── README.md
│ ├── src
│ │ ├── ast
│ │ │ ├── ast_nodes.rs
│ │ │ ├── ast.rs
│ │ │ ├── impls
│ │ │ │ ├── ctx
│ │ │ │ │ ├── utils.rs
│ │ │ │ │ └── workspace.rs
│ │ │ │ ├── ctx.rs
│ │ │ │ ├── disp
│ │ │ │ │ ├── blocks.rs
│ │ │ │ │ ├── contracts.rs
│ │ │ │ │ ├── enumerations.rs
│ │ │ │ │ ├── errors.rs
│ │ │ │ │ ├── events.rs
│ │ │ │ │ ├── expressions.rs
│ │ │ │ │ ├── functions.rs
│ │ │ │ │ ├── identifiers.rs
│ │ │ │ │ ├── literals.rs
│ │ │ │ │ ├── modifiers.rs
│ │ │ │ │ ├── statements.rs
│ │ │ │ │ ├── structures.rs
│ │ │ │ │ ├── types.rs
│ │ │ │ │ ├── user_defined_value_types.rs
│ │ │ │ │ ├── using_for_directives.rs
│ │ │ │ │ └── variables.rs
│ │ │ │ ├── disp.rs
│ │ │ │ ├── node
│ │ │ │ │ ├── blocks.rs
│ │ │ │ │ ├── contracts.rs
│ │ │ │ │ ├── documentation.rs
│ │ │ │ │ ├── enumerations.rs
│ │ │ │ │ ├── errors.rs
│ │ │ │ │ ├── events.rs
│ │ │ │ │ ├── expressions.rs
│ │ │ │ │ ├── functions.rs
│ │ │ │ │ ├── identifiers.rs
│ │ │ │ │ ├── import_directives.rs
│ │ │ │ │ ├── literals.rs
│ │ │ │ │ ├── modifiers.rs
│ │ │ │ │ ├── pragma_directives.rs
│ │ │ │ │ ├── source_units.rs
│ │ │ │ │ ├── statements.rs
│ │ │ │ │ ├── structures.rs
│ │ │ │ │ ├── types.rs
│ │ │ │ │ ├── user_defined_value_types.rs
│ │ │ │ │ ├── using_for_directives.rs
│ │ │ │ │ └── variables.rs
│ │ │ │ ├── node.rs
│ │ │ │ ├── own
│ │ │ │ │ ├── hashing.rs
│ │ │ │ │ ├── node_id.rs
│ │ │ │ │ ├── source_units.rs
│ │ │ │ │ └── utils.rs
│ │ │ │ └── own.rs
│ │ │ ├── impls.rs
│ │ │ ├── macros.rs
│ │ │ ├── magic.rs
│ │ │ ├── node_type.rs
│ │ │ └── yul.rs
│ │ ├── ast.rs
│ │ ├── audit
│ │ │ ├── attack_surface.rs
│ │ │ ├── auditor.rs
│ │ │ ├── entrypoint.rs
│ │ │ └── public_functions_no_sender.rs
│ │ ├── audit.rs
│ │ ├── context
│ │ │ ├── browser
│ │ │ │ ├── ancestral_line.rs
│ │ │ │ ├── closest_ancestor.rs
│ │ │ │ ├── external_calls.rs
│ │ │ │ ├── extractor.rs
│ │ │ │ ├── immediate_children.rs
│ │ │ │ ├── location.rs
│ │ │ │ ├── macros.rs
│ │ │ │ ├── parent.rs
│ │ │ │ ├── peek_over.rs
│ │ │ │ ├── peek_under.rs
│ │ │ │ ├── peek.rs
│ │ │ │ ├── siblings.rs
│ │ │ │ ├── sort_nodes.rs
│ │ │ │ └── storage_vars.rs
│ │ │ ├── browser.rs
│ │ │ ├── capturable.rs
│ │ │ ├── flow
│ │ │ │ ├── display.rs
│ │ │ │ ├── error.rs
│ │ │ │ ├── kind.rs
│ │ │ │ ├── primitives.rs
│ │ │ │ ├── reducibles.rs
│ │ │ │ ├── tests.rs
│ │ │ │ ├── utils.rs
│ │ │ │ ├── visualizer.rs
│ │ │ │ └── voids.rs
│ │ │ ├── flow.rs
│ │ │ ├── graph
│ │ │ │ ├── callgraph
│ │ │ │ │ ├── legacy.rs
│ │ │ │ │ ├── new.rs
│ │ │ │ │ ├── tests.rs
│ │ │ │ │ ├── utils.rs
│ │ │ │ │ └── visit.rs
│ │ │ │ ├── callgraph.rs
│ │ │ │ ├── preprocess
│ │ │ │ │ ├── legacy.rs
│ │ │ │ │ └── new.rs
│ │ │ │ ├── preprocess.rs
│ │ │ │ ├── traits.rs
│ │ │ │ └── utils.rs
│ │ │ ├── graph.rs
│ │ │ ├── macros.rs
│ │ │ ├── mcp
│ │ │ │ ├── callgraph
│ │ │ │ │ ├── render.rs
│ │ │ │ │ ├── tool.rs
│ │ │ │ │ └── utils.rs
│ │ │ │ ├── callgraph.rs
│ │ │ │ ├── contract_surface
│ │ │ │ │ ├── render.rs
│ │ │ │ │ ├── tool.rs
│ │ │ │ │ └── util.rs
│ │ │ │ ├── contract_surface.rs
│ │ │ │ ├── list_contracts
│ │ │ │ │ ├── render.rs
│ │ │ │ │ └── tool.rs
│ │ │ │ ├── list_contracts.rs
│ │ │ │ ├── node_finder
│ │ │ │ │ ├── render.rs
│ │ │ │ │ ├── tool.rs
│ │ │ │ │ └── utils.rs
│ │ │ │ ├── node_finder.rs
│ │ │ │ ├── node_summarizer
│ │ │ │ │ ├── render.rs
│ │ │ │ │ ├── tool.rs
│ │ │ │ │ └── utils.rs
│ │ │ │ ├── node_summarizer.rs
│ │ │ │ ├── project_overview
│ │ │ │ │ ├── render.rs
│ │ │ │ │ └── tool.rs
│ │ │ │ ├── project_overview.rs
│ │ │ │ ├── tool_guide
│ │ │ │ │ └── tool.rs
│ │ │ │ └── tool_guide.rs
│ │ │ ├── mcp.rs
│ │ │ ├── router
│ │ │ │ ├── external_calls.rs
│ │ │ │ ├── internal_calls.rs
│ │ │ │ ├── modifier_calls.rs
│ │ │ │ └── tests.rs
│ │ │ ├── router.rs
│ │ │ └── workspace.rs
│ │ ├── context.rs
│ │ ├── detect
│ │ │ ├── detector.rs
│ │ │ ├── entrypoint.rs
│ │ │ ├── helpers.rs
│ │ │ ├── high
│ │ │ │ ├── _template.rs
│ │ │ │ ├── abi_encode_packed_hash_collision.rs
│ │ │ │ ├── arbitrary_transfer_from.rs
│ │ │ │ ├── const_func_changes_state.rs
│ │ │ │ ├── contract_locks_ether.rs
│ │ │ │ ├── dangerous_unary_operator.rs
│ │ │ │ ├── delegate_call_unchecked_address.rs
│ │ │ │ ├── delete_nested_mapping.rs
│ │ │ │ ├── dynamic_array_length_assignment.rs
│ │ │ │ ├── enumerable_loop_removal.rs
│ │ │ │ ├── eth_send_unchecked_address.rs
│ │ │ │ ├── experimental_encoder.rs
│ │ │ │ ├── function_selector_collision.rs
│ │ │ │ ├── incorrect_caret_operator.rs
│ │ │ │ ├── incorrect_erc20_interface.rs
│ │ │ │ ├── incorrect_erc721_interface.rs
│ │ │ │ ├── incorrect_shift_order.rs
│ │ │ │ ├── misused_boolean.rs
│ │ │ │ ├── msg_value_in_loops.rs
│ │ │ │ ├── multiple_constructors.rs
│ │ │ │ ├── nested_struct_in_mapping.rs
│ │ │ │ ├── out_of_order_retryable.rs
│ │ │ │ ├── pre_declared_variable_usage.rs
│ │ │ │ ├── reentrancy_state_change.rs
│ │ │ │ ├── reused_contract_name.rs
│ │ │ │ ├── rtlo.rs
│ │ │ │ ├── selfdestruct.rs
│ │ │ │ ├── signed_integer_storage_array.rs
│ │ │ │ ├── state_variable_shadowing.rs
│ │ │ │ ├── storage_array_memory_edit.rs
│ │ │ │ ├── strict_equality_contract_balance.rs
│ │ │ │ ├── tautological_compare.rs
│ │ │ │ ├── tautology_or_contradiction.rs
│ │ │ │ ├── tx_origin_used_for_auth.rs
│ │ │ │ ├── unchecked_low_level_call.rs
│ │ │ │ ├── unchecked_send.rs
│ │ │ │ ├── unprotected_initializer.rs
│ │ │ │ ├── unsafe_casting.rs
│ │ │ │ ├── weak_randomness.rs
│ │ │ │ └── yul_return.rs
│ │ │ ├── high.rs
│ │ │ ├── low
│ │ │ │ ├── _template.rs
│ │ │ │ ├── assert_state_change.rs
│ │ │ │ ├── block_timestamp_deadline.rs
│ │ │ │ ├── boolean_equality.rs
│ │ │ │ ├── builtin_symbol_shadowing.rs
│ │ │ │ ├── centralization_risk.rs
│ │ │ │ ├── constant_function_contains_assembly.rs
│ │ │ │ ├── costly_loop.rs
│ │ │ │ ├── dead_code.rs
│ │ │ │ ├── delegatecall_in_loop.rs
│ │ │ │ ├── deprecated_oz_function.rs
│ │ │ │ ├── division_before_multiplication.rs
│ │ │ │ ├── ecrecover.rs
│ │ │ │ ├── empty_block.rs
│ │ │ │ ├── empty_require_revert.rs
│ │ │ │ ├── function_initializing_state.rs
│ │ │ │ ├── function_pointer_in_constructor.rs
│ │ │ │ ├── inconsistent_type_names.rs
│ │ │ │ ├── incorrect_modifier.rs
│ │ │ │ ├── internal_function_used_once.rs
│ │ │ │ ├── large_numeric_literal.rs
│ │ │ │ ├── literal_instead_of_constant.rs
│ │ │ │ ├── local_variable_shadowing.rs
│ │ │ │ ├── missing_inheritance.rs
│ │ │ │ ├── modifier_used_only_once.rs
│ │ │ │ ├── multiple_placeholders.rs
│ │ │ │ ├── non_reentrant_not_first.rs
│ │ │ │ ├── push_0_opcode.rs
│ │ │ │ ├── redundant_statement.rs
│ │ │ │ ├── require_revert_in_loop.rs
│ │ │ │ ├── return_bomb.rs
│ │ │ │ ├── solmate_safe_transfer_lib.rs
│ │ │ │ ├── state_change_without_event.rs
│ │ │ │ ├── state_no_address_check.rs
│ │ │ │ ├── state_variable_could_be_constant.rs
│ │ │ │ ├── state_variable_could_be_immutable.rs
│ │ │ │ ├── state_variable_read_external.rs
│ │ │ │ ├── storage_array_length_not_cached.rs
│ │ │ │ ├── todo.rs
│ │ │ │ ├── unchecked_return.rs
│ │ │ │ ├── uninitialized_local_variable.rs
│ │ │ │ ├── unsafe_erc20_operation.rs
│ │ │ │ ├── unsafe_oz_erc721_mint.rs
│ │ │ │ ├── unspecific_solidity_pragma.rs
│ │ │ │ ├── unused_error.rs
│ │ │ │ ├── unused_import.rs
│ │ │ │ ├── unused_public_function.rs
│ │ │ │ ├── unused_state_variable.rs
│ │ │ │ └── void_constructor.rs
│ │ │ ├── low.rs
│ │ │ └── test_utils.rs
│ │ ├── detect.rs
│ │ ├── lib.rs
│ │ ├── stats
│ │ │ ├── cloc.rs
│ │ │ ├── dbg_tips.txt
│ │ │ ├── ignore.rs
│ │ │ ├── token.rs
│ │ │ └── util.rs
│ │ ├── stats.rs
│ │ ├── test_utils
│ │ │ └── load_source_unit.rs
│ │ ├── test_utils.rs
│ │ ├── visitor
│ │ │ ├── ast_visitor.rs
│ │ │ ├── macros.rs
│ │ │ └── workspace_visitor.rs
│ │ └── visitor.rs
│ ├── templates
│ │ └── mcp-tool-response
│ │ ├── callgraph.md
│ │ ├── contract_surface.md
│ │ ├── list_contracts.md
│ │ ├── node_finder_get_all.md
│ │ ├── node_finder_grep.md
│ │ ├── node_finder_search.md
│ │ ├── node_summarizer.md
│ │ ├── project_overview.md
│ │ └── tool_guide.md
│ └── tests
│ ├── common
│ │ ├── ancestral_line.rs
│ │ ├── closest_ancestor.rs
│ │ ├── immediate_children.rs
│ │ ├── immediate_parent.rs
│ │ ├── mod.rs
│ │ ├── new_ast_nodes.rs
│ │ ├── peek_over.rs
│ │ └── sibling.rs
│ └── traversal.rs
├── aderyn_driver
│ ├── .gitignore
│ ├── benches
│ │ └── detectors.rs
│ ├── Cargo.toml
│ ├── README.md
│ ├── src
│ │ ├── compile.rs
│ │ ├── config.rs
│ │ ├── display.rs
│ │ ├── driver.rs
│ │ ├── interface
│ │ │ ├── json.rs
│ │ │ ├── lsp.rs
│ │ │ ├── markdown.rs
│ │ │ ├── mod.rs
│ │ │ ├── sarif.rs
│ │ │ ├── tables.rs
│ │ │ └── util.rs
│ │ ├── lib.rs
│ │ ├── mcp.rs
│ │ ├── process.rs
│ │ └── runner.rs
│ └── tests
│ └── astgen.rs
├── bacon.toml
├── benchmarks
│ ├── aderyn
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── iteration_times.svg
│ │ │ └── pdf.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── iteration_times_small.svg
│ │ ├── iteration_times.svg
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── relative_iteration_times_small.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── SD.svg
│ │ └── typical.svg
│ ├── arbitrary-transfer-from
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── avoid-abi-encode-packed
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── block-timestamp-deadline
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── centralization-risk
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── constants-instead-of-literals
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── delegate-call-in-loop
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── deprecated-oz-functions
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── ecrecover
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── empty-block
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── hello_world
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── inconsistent-type-names
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── large-numeric-literal
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── non-reentrant-before-others
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── push-zero-opcode
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── report
│ │ └── index.html
│ ├── require-with-string
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── solmate-safe-transfer-lib
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── unindexed-events
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── unprotected-initializer
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── unsafe-erc20-functions
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── unsafe-oz-erc721-mint
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── unspecific-solidity-pragma
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── useless-internal-function
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── useless-modifier
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ ├── useless-public-function
│ │ ├── base
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ ├── change
│ │ │ └── estimates.json
│ │ ├── new
│ │ │ ├── benchmark.json
│ │ │ ├── estimates.json
│ │ │ ├── sample.json
│ │ │ └── tukey.json
│ │ └── report
│ │ ├── both
│ │ │ ├── pdf.svg
│ │ │ └── regression.svg
│ │ ├── change
│ │ │ ├── mean.svg
│ │ │ ├── median.svg
│ │ │ └── t-test.svg
│ │ ├── index.html
│ │ ├── MAD.svg
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ ├── pdf_small.svg
│ │ ├── pdf.svg
│ │ ├── regression_small.svg
│ │ ├── regression.svg
│ │ ├── relative_pdf_small.svg
│ │ ├── relative_regression_small.svg
│ │ ├── SD.svg
│ │ ├── slope.svg
│ │ └── typical.svg
│ └── zero-address-check
│ ├── base
│ │ ├── benchmark.json
│ │ ├── estimates.json
│ │ ├── sample.json
│ │ └── tukey.json
│ ├── change
│ │ └── estimates.json
│ ├── new
│ │ ├── benchmark.json
│ │ ├── estimates.json
│ │ ├── sample.json
│ │ └── tukey.json
│ └── report
│ ├── both
│ │ ├── pdf.svg
│ │ └── regression.svg
│ ├── change
│ │ ├── mean.svg
│ │ ├── median.svg
│ │ └── t-test.svg
│ ├── index.html
│ ├── MAD.svg
│ ├── mean.svg
│ ├── median.svg
│ ├── pdf_small.svg
│ ├── pdf.svg
│ ├── regression_small.svg
│ ├── regression.svg
│ ├── relative_pdf_small.svg
│ ├── relative_regression_small.svg
│ ├── SD.svg
│ ├── slope.svg
│ └── typical.svg
├── Cargo.lock
├── Cargo.toml
├── cli
│ ├── benchmarks.sh
│ └── reportgen.sh
├── CODEOWNERS
├── CONTRIBUTING.md
├── cyfrinup
│ ├── dynamic_script
│ └── why.md
├── deny.toml
├── dist-workspace.toml
├── funding.json
├── LICENSE
├── Makefile
├── package-lock.json
├── package.json
├── README.md
├── RELEASE_CHECKLIST.md
├── reports
│ ├── adhoc-sol-files-highs-only-report.json
│ ├── adhoc-sol-files-report.md
│ ├── ccip-functions-report.md
│ ├── empty_report.md
│ ├── hardhat-playground-report.md
│ ├── nft-report-icm.md
│ ├── nft-report.md
│ ├── prb-math-report.md
│ ├── report.json
│ ├── report.md
│ ├── report.sarif
│ ├── sablier-aderyn-toml-nested-root.md
│ ├── templegold-report.md
│ └── uniswap_profile.md
├── rust-toolchain.toml
├── rustfmt.toml
├── tests
│ ├── adhoc-sol-files
│ │ ├── aderyn.toml
│ │ ├── Counter.sol
│ │ ├── DemoASTNodes.sol
│ │ ├── Helper.sol
│ │ ├── InconsistentUints.sol
│ │ ├── inheritance
│ │ │ ├── ExtendedInheritance.sol
│ │ │ ├── IContractInheritance.sol
│ │ │ └── InheritanceBase.sol
│ │ ├── InternalFunctions.sol
│ │ ├── lib
│ │ │ └── ThisShouldBeExcluded.sol
│ │ ├── multiple-versions
│ │ │ ├── 0.4
│ │ │ │ ├── A.sol
│ │ │ │ └── B.sol
│ │ │ ├── 0.5
│ │ │ │ ├── A.sol
│ │ │ │ └── B.sol
│ │ │ ├── 0.6
│ │ │ │ ├── A.sol
│ │ │ │ └── B.sol
│ │ │ ├── 0.7
│ │ │ │ ├── A.sol
│ │ │ │ └── B.sol
│ │ │ └── 0.8
│ │ │ ├── A.sol
│ │ │ └── B.sol
│ │ ├── OnceModifierExample.sol
│ │ └── StateVariables.sol
│ ├── ast
│ │ ├── abstract_contract.json
│ │ ├── address_payable.json
│ │ ├── array_type_name.json
│ │ ├── ast-erc4626.json
│ │ ├── base_constructor_call.json
│ │ ├── bit_not.json
│ │ ├── call.json
│ │ ├── constructor.json
│ │ ├── contract_dep_order.json
│ │ ├── do_while.json
│ │ ├── documentation_1.json
│ │ ├── documentation_2.json
│ │ ├── documentation_3.json
│ │ ├── documentation_local_variable.json
│ │ ├── documentation_on_statements.json
│ │ ├── documentation_triple.json
│ │ ├── empty_block.json
│ │ ├── enum_value_declaration.json
│ │ ├── enum_value.json
│ │ ├── event_definition.json
│ │ ├── experimental_encoder_pragma.json
│ │ ├── fallback_and_reveice_ether.json
│ │ ├── fallback_payable.json
│ │ ├── fallback.json
│ │ ├── function_type.json
│ │ ├── function.json
│ │ ├── global_enum.json
│ │ ├── global_struct.json
│ │ ├── inheritance_specifier.json
│ │ ├── leave.json
│ │ ├── license.json
│ │ ├── long_type_name_binary_operation.json
│ │ ├── long_type_name_identifier.json
│ │ ├── loop.json
│ │ ├── mappings.json
│ │ ├── modifier_definition.json
│ │ ├── modifier_invocation.json
│ │ ├── mutability.json
│ │ ├── nested_functions.json
│ │ ├── non_utf8.json
│ │ ├── override.json
│ │ ├── placeholder_statement.json
│ │ ├── receive_ether.json
│ │ ├── short_type_name_ref.json
│ │ ├── short_type_name.json
│ │ ├── slot_offset.json
│ │ ├── smoke.json
│ │ ├── source_location.json
│ │ ├── string.json
│ │ ├── stringlit.json
│ │ ├── switch_default.json
│ │ ├── switch.json
│ │ ├── try_catch.json
│ │ ├── two_base_functions.json
│ │ ├── unicode.json
│ │ ├── used_errors.json
│ │ ├── userDefinedValueType.json
│ │ ├── using_for_directive.json
│ │ ├── var_access.json
│ │ └── yul_hex_literal.json
│ ├── contract-playground
│ │ ├── .github
│ │ │ └── workflows
│ │ │ └── test.yml
│ │ ├── .gitignore
│ │ ├── dot
│ │ │ └── .gitkeep
│ │ ├── foundry.toml
│ │ ├── README.md
│ │ ├── script
│ │ │ └── Counter.s.sol
│ │ ├── src
│ │ │ ├── AbstractContract.sol
│ │ │ ├── AderynIgnoreCustomDetectors.sol
│ │ │ ├── AdminContract.sol
│ │ │ ├── ArbitraryTransferFrom.sol
│ │ │ ├── AssemblyExample.sol
│ │ │ ├── AssertStateChange.sol
│ │ │ ├── auditor_mode
│ │ │ │ ├── ExternalCalls.sol
│ │ │ │ └── PublicFunctionsWithoutSenderCheck.sol
│ │ │ ├── BooleanEquality.sol
│ │ │ ├── BuiltinSymbolShadow.sol
│ │ │ ├── CacheArrayLength.sol
│ │ │ ├── CallGraphTests.sol
│ │ │ ├── Casting.sol
│ │ │ ├── cloc
│ │ │ │ ├── AnotherHeavilyCommentedContract.sol
│ │ │ │ ├── EmptyContractFile.sol
│ │ │ │ └── HeavilyCommentedContract.sol
│ │ │ ├── CompilerBugStorageSignedIntegerArray.sol
│ │ │ ├── ConstantFuncsAssembly.sol
│ │ │ ├── ConstantsLiterals.sol
│ │ │ ├── ConstFuncChangeState.sol
│ │ │ ├── ContractLocksEther.sol
│ │ │ ├── ContractWithTodo.sol
│ │ │ ├── control_flow
│ │ │ │ └── SimpleProgram.sol
│ │ │ ├── CostlyOperationsInsideLoops.sol
│ │ │ ├── Counter.sol
│ │ │ ├── CrazyPragma.sol
│ │ │ ├── DangerousStrictEquality1.sol
│ │ │ ├── DangerousStrictEquality2.sol
│ │ │ ├── DangerousUnaryOperator.sol
│ │ │ ├── DeadCode.sol
│ │ │ ├── DelegateCallWithoutAddressCheck.sol
│ │ │ ├── DeletionNestedMappingStructureContract.sol
│ │ │ ├── DeprecatedOZFunctions.sol
│ │ │ ├── DivisionBeforeMultiplication.sol
│ │ │ ├── DynamicArrayLengthAssignment.sol
│ │ │ ├── EmitAfterExternalCall.sol
│ │ │ ├── EmptyBlocks.sol
│ │ │ ├── EnumerableSetIteration.sol
│ │ │ ├── eth2
│ │ │ │ └── DepositContract.sol
│ │ │ ├── ExperimentalEncoder.sol
│ │ │ ├── ExternalCalls.sol
│ │ │ ├── FunctionInitializingState.sol
│ │ │ ├── FunctionPointers.sol
│ │ │ ├── FunctionSignatureCollision.sol
│ │ │ ├── HugeConstants.sol
│ │ │ ├── IgnoreEverything.sol
│ │ │ ├── InconsistentUints.sol
│ │ │ ├── IncorrectCaretOperator.sol
│ │ │ ├── IncorrectERC20.sol
│ │ │ ├── IncorrectERC721.sol
│ │ │ ├── IncorrectModifier.sol
│ │ │ ├── IncorrectShift.sol
│ │ │ ├── inheritance
│ │ │ │ ├── ExtendedInheritance.sol
│ │ │ │ ├── IContractInheritance.sol
│ │ │ │ └── InheritanceBase.sol
│ │ │ ├── InternalFunctions.sol
│ │ │ ├── KeccakContract.sol
│ │ │ ├── LocalVariableShadow.sol
│ │ │ ├── MissingInheritance.sol
│ │ │ ├── MisusedBoolean.sol
│ │ │ ├── MsgValueInLoop.sol
│ │ │ ├── MultipleConstructorSchemes.sol
│ │ │ ├── MultiplePlaceholders.sol
│ │ │ ├── nested
│ │ │ │ ├── 1
│ │ │ │ │ └── Nested.sol
│ │ │ │ └── 2
│ │ │ │ └── Nested.sol
│ │ │ ├── nested_mappings
│ │ │ │ ├── LaterVersion.sol
│ │ │ │ └── NestedMappings.sol
│ │ │ ├── OnceModifierExample.sol
│ │ │ ├── OnlyLibrary.sol
│ │ │ ├── OutOfOrderRetryable.sol
│ │ │ ├── parent_chain
│ │ │ │ └── ParentChainContract.sol
│ │ │ ├── PragmaRange.sol
│ │ │ ├── PreDeclaredVarUsage.sol
│ │ │ ├── PublicFunction.sol
│ │ │ ├── PublicVariableReadInExternalContext.sol
│ │ │ ├── RedundantStatements.sol
│ │ │ ├── ReturnBomb.sol
│ │ │ ├── reused_contract_name
│ │ │ │ ├── ContractA.sol
│ │ │ │ └── ContractB.sol
│ │ │ ├── RevertsAndRequriesInLoops.sol
│ │ │ ├── router
│ │ │ │ ├── ExternalCalls.sol
│ │ │ │ ├── FallbackAndReceiveOverrides.sol
│ │ │ │ ├── InternalCalls.sol
│ │ │ │ ├── ModifierCalls.sol
│ │ │ │ └── VarOverridesFunction.sol
│ │ │ ├── RTLO.sol
│ │ │ ├── SendEtherNoChecks.sol
│ │ │ ├── SendEtherNoChecksLibImport.sol
│ │ │ ├── StateChangeAfterExternalCall.sol
│ │ │ ├── StateShadowing.sol
│ │ │ ├── StateVariableCouldBeDeclaredConstant.sol
│ │ │ ├── StateVariableCouldBeDeclaredImmutable.sol
│ │ │ ├── StateVariables.sol
│ │ │ ├── StateVariablesChangesWithoutEvents.sol
│ │ │ ├── StateVariablesManipulation.sol
│ │ │ ├── StorageConditionals.sol
│ │ │ ├── StorageParameters.sol
│ │ │ ├── T11sTranferer.sol
│ │ │ ├── TautologicalCompare.sol
│ │ │ ├── TautologyOrContradiction.sol
│ │ │ ├── TestERC20.sol
│ │ │ ├── TransientKeyword.sol
│ │ │ ├── Trump.sol
│ │ │ ├── TxOriginUsedForAuth.sol
│ │ │ ├── U2.sol
│ │ │ ├── U3.sol
│ │ │ ├── U4.sol
│ │ │ ├── U5.sol
│ │ │ ├── UncheckedCalls.sol
│ │ │ ├── UncheckedReturn.sol
│ │ │ ├── UncheckedSend.sol
│ │ │ ├── UninitializedLocalVariables.sol
│ │ │ ├── UninitializedStateVariable.sol
│ │ │ ├── uniswap
│ │ │ │ ├── UniswapV2Swapper.sol
│ │ │ │ └── UniswapV3Swapper.sol
│ │ │ ├── UnprotectedInitialize.sol
│ │ │ ├── UnsafeERC721Mint.sol
│ │ │ ├── UnusedError.sol
│ │ │ ├── UnusedImport.sol
│ │ │ ├── UnusedStateVariables.sol
│ │ │ ├── UsingSelfdestruct.sol
│ │ │ ├── VoidConstructor.sol
│ │ │ ├── WeakRandomness.sol
│ │ │ ├── WrongOrderOfLayout.sol
│ │ │ ├── YulReturn.sol
│ │ │ └── ZeroAddressCheck.sol
│ │ └── test
│ │ └── Counter.t.sol
│ ├── foundry-nft-f23
│ │ ├── .github
│ │ │ └── workflows
│ │ │ └── test.yml
│ │ ├── .gitignore
│ │ ├── foundry.lock
│ │ ├── foundry.toml
│ │ ├── README.md
│ │ ├── remappings.txt
│ │ └── src
│ │ ├── BasicNft.sol
│ │ ├── F1.sol
│ │ ├── F2.sol
│ │ ├── Initializer.sol
│ │ └── inner-core-modules
│ │ └── ICM.sol
│ ├── foundry-nft-f23-icm
│ │ ├── .github
│ │ │ └── workflows
│ │ │ └── test.yml
│ │ ├── .gitignore
│ │ ├── aderyn.toml
│ │ ├── foundry.toml
│ │ ├── README.md
│ │ ├── remappings.txt
│ │ └── src
│ │ ├── BasicNft.sol
│ │ ├── F1.sol
│ │ ├── F2.sol
│ │ ├── Initializer.sol
│ │ └── inner-core-modules
│ │ └── ICM.sol
│ ├── hardhat-js-playground
│ │ ├── .gitignore
│ │ ├── artifacts
│ │ │ ├── build-info
│ │ │ │ └── cee6fe9a9a2f03f7ff10a27ab2746af6.json
│ │ │ └── contracts
│ │ │ ├── Counter.sol
│ │ │ │ ├── Counter.dbg.json
│ │ │ │ └── Counter.json
│ │ │ ├── ExtendedInheritance.sol
│ │ │ │ ├── ExtendedInheritance.dbg.json
│ │ │ │ └── ExtendedInheritance.json
│ │ │ ├── IContractInheritance.sol
│ │ │ │ ├── IContractInheritance.dbg.json
│ │ │ │ └── IContractInheritance.json
│ │ │ ├── InheritanceBase.sol
│ │ │ │ ├── InheritanceBase.dbg.json
│ │ │ │ └── InheritanceBase.json
│ │ │ ├── KeccakContract.sol
│ │ │ │ ├── KeccakContract.dbg.json
│ │ │ │ └── KeccakContract.json
│ │ │ ├── Lock.sol
│ │ │ │ ├── Lock.dbg.json
│ │ │ │ └── Lock.json
│ │ │ └── StateVariables.sol
│ │ │ ├── StateVariables.dbg.json
│ │ │ └── StateVariables.json
│ │ ├── contracts
│ │ │ ├── Counter.sol
│ │ │ ├── ExtendedInheritance.sol
│ │ │ ├── IContractInheritance.sol
│ │ │ ├── InheritanceBase.sol
│ │ │ ├── KeccakContract.sol
│ │ │ ├── Lock.sol
│ │ │ └── StateVariables.sol
│ │ ├── hardhat.config.js
│ │ ├── package.json
│ │ ├── README.md
│ │ ├── scripts
│ │ │ └── deploy.js
│ │ ├── test
│ │ │ └── Lock.js
│ │ └── yarn.lock
│ ├── no-sol-files
│ │ ├── extra
│ │ │ └── HelloAgain.md
│ │ ├── Hello.txt
│ │ └── Hello.yul
│ └── toml
│ ├── nested_project1
│ │ ├── aderyn.toml
│ │ ├── folder1
│ │ │ └── hardhat.config.ts
│ │ ├── folder2
│ │ │ └── hardhat.config.ts
│ │ └── folder3
│ │ └── file.txt
│ └── nested_project2
│ ├── aderyn.toml
│ ├── folder1
│ │ └── foundry.toml
│ └── folder2
│ └── file1.txt
├── tools
│ └── xtask
│ ├── Cargo.toml
│ └── src
│ ├── blesspr.rs
│ ├── cut_release.rs
│ ├── flags.rs
│ ├── main.rs
│ ├── reportgen.rs
│ └── tomlgen.rs
└── typos.toml
```
# Files
--------------------------------------------------------------------------------
/aderyn_core/src/context/flow.rs:
--------------------------------------------------------------------------------
```rust
pub mod display;
pub mod error;
pub mod kind;
pub mod primitives;
pub mod reducibles;
mod tests;
pub mod utils;
pub mod visualizer;
pub mod voids;
use crate::{
ast::*,
context::flow::utils::{Calibration, discover_jump_sources},
};
pub use kind::CfgNodeKind;
pub use reducibles::CfgBlock;
use std::collections::{HashMap, HashSet, VecDeque, hash_map::Entry};
use self::{
primitives::*,
reducibles::{
CfgDoWhileStatement, CfgForStatement, CfgIfStatement, CfgUncheckedBlock, CfgWhileStatement,
},
utils::find_jump_dest,
voids::{CfgEndNode, CfgStartNode},
};
use super::workspace::WorkspaceContext;
// This is done to differentiate AstNodeIDs from CfgNodeIDs
type AstNodeId = NodeID;
#[derive(Eq, Hash, Default, PartialEq, Clone, Copy, Debug, PartialOrd, Ord)]
pub struct CfgNodeId(usize);
impl CfgNodeId {
#[allow(dead_code)]
fn peek(&self) -> usize {
self.0
}
#[allow(dead_code)]
fn peek_mut(&mut self) -> &mut usize {
&mut self.0
}
fn advance(&mut self) {
self.0 += 1;
}
}
#[derive(Debug, Clone)]
pub enum CfgNodeDescriptor {
// Void nodes
Start(Box<CfgStartNode>),
End(Box<CfgEndNode>),
// Primitives
VariableDeclarationStatement(Box<CfgVariableDeclarationStatement>),
ExpressionStatement(Box<CfgExpressionStatement>),
PlaceholderStatement(Box<CfgPlaceholderStatement>),
Break(Box<CfgBreakStatement>),
Continue(Box<CfgContinueStatement>),
Return(Box<CfgReturnStatement>),
EmitStatement(Box<CfgEmitStatement>),
RevertStatement(Box<CfgRevertStatement>),
TryStatement(Box<CfgTryStatement>),
InlineAssembly(Box<CfgInlineAssemblyStatement>),
IfStatementCondition(Box<CfgIfStatementCondition>),
WhileStatementCondition(Box<CfgWhileStatementCondition>),
ForStatementCondition(Box<CfgForStatementCondition>),
DoWhileStatementCondition(Box<CfgDoWhileStatementCondition>),
// Reducibles
Block(Box<CfgBlock>),
UncheckedBlock(Box<CfgUncheckedBlock>),
IfStatement(Box<CfgIfStatement>),
WhileStatement(Box<CfgWhileStatement>),
ForStatement(Box<CfgForStatement>),
DoWhileStatement(Box<CfgDoWhileStatement>),
}
#[derive(Debug, Clone)]
pub struct CfgNode {
/// Node ID
pub id: CfgNodeId,
/// Node descriptor
pub nd: CfgNodeDescriptor,
}
/// Control fow graph
#[derive(Default, Debug)]
pub struct Cfg {
/// Node registry
pub nodes: HashMap<CfgNodeId, CfgNode>,
/// Adjacency list representation of the Control Flow Graph
pub adj_list: HashMap<CfgNodeId, Vec<CfgNodeId>>,
/// ID to construct the next node
next_available_id: CfgNodeId,
/// Current reducibles
reduction_queue: VecDeque<CfgNodeId>,
/// Lookup the corresponding End node for any start node (Start*, End*)
start_end_pairs: HashMap<CfgNodeId, CfgNodeId>,
/// Lookup the Condition node for a given loop's start node
start_cond_pairs: HashMap<CfgNodeId, CfgNodeId>,
/// Lookup the loop_expression node for a given for loop's start node
start_loop_expr: HashMap<CfgNodeId, CfgNodeId>,
/// Lookup the StartFor given end of loop_expr
loop_expr_start: HashMap<CfgNodeId, CfgNodeId>,
/// Lookup the StartWhile, StartDoWhile of a loop condition given condition
cond_start_pairs: HashMap<CfgNodeId, CfgNodeId>,
}
pub trait CfgReduce {
fn reduce(&self, context: &WorkspaceContext, cfg: &mut Cfg) -> (CfgNodeId, CfgNodeId);
}
impl Cfg {
pub fn new() -> Self {
Default::default()
}
pub fn total_nodes(&self) -> usize {
debug_assert_eq!(self.next_available_id.peek(), self.nodes.len());
self.next_available_id.peek()
}
pub fn total_edges(&self) -> usize {
self.adj_list.values().map(|conn| conn.len()).sum()
}
fn add_raw_node(&mut self, id: CfgNodeId, nd: CfgNodeDescriptor) {
let cfg_node = CfgNode { id, nd };
self.nodes.insert(id, cfg_node);
}
fn add_raw_directed_edge(&mut self, from: CfgNodeId, to: CfgNodeId) {
match self.adj_list.entry(from) {
Entry::Vacant(v) => {
v.insert(vec![to]);
}
Entry::Occupied(mut o) => {
o.get_mut().push(to);
}
};
}
fn remove_raw_directed_edge(&mut self, from: CfgNodeId, to: CfgNodeId) {
let existing_nodes = self.adj_list.get_mut(&from).expect("Relationship doesn't exist");
existing_nodes.retain_mut(|x| *x != to);
}
fn raw_predecessors(&self, id: CfgNodeId) -> Vec<CfgNodeId> {
let mut predecessors = vec![];
for (from, to_list) in &self.adj_list {
if to_list.contains(&id) {
predecessors.push(*from);
}
}
predecessors
}
fn raw_successors(&self, id: CfgNodeId) -> Vec<CfgNodeId> {
let Some(successors) = self.adj_list.get(&id) else {
return Default::default();
};
successors.to_vec()
}
fn remove_raw_edges_involving(&mut self, node_id: CfgNodeId) {
// Remove all successors' edges starting from node_id
self.adj_list.remove(&node_id);
// Remove edges ending at node_id
for (_, to_list) in self.adj_list.iter_mut() {
to_list.retain_mut(|x| *x != node_id);
}
}
fn reset_raw_successors(&mut self, node_id: CfgNodeId, to: CfgNodeId) {
// Remove edges starting from node_id
self.adj_list.remove(&node_id);
self.add_raw_directed_edge(node_id, to);
}
}
impl Cfg {
/// Assigns a unique ID to the given node and adds it to the CFG
#[must_use]
pub fn add_node(&mut self, nd: CfgNodeDescriptor) -> CfgNodeId {
// Grab the currently available id
let node_id = self.next_available_id;
// Increment the ID for next use
self.next_available_id.advance();
// Check that node with that ID has not already been inserted
assert!(!self.nodes.contains_key(&node_id));
// Queue the node to be reduced if it is reducible
if nd.kind() == CfgNodeKind::Reducible {
self.reduction_queue.push_back(node_id);
}
// Add the node to the CFG
self.add_raw_node(node_id, nd);
//Maintain map from ast to cfg
//if let Some(ast_id) = nd.reflect() {
// self.ast_to_cfg.insert(ast_id, node_id);
//}
// Check that node has been inserted
assert!(self.nodes.contains_key(&node_id));
// Return the ID of the freshly inserted node
node_id
}
/// Disconnects existing relationships (mostly used during reduction)
pub fn remove_flow_edge(&mut self, from: CfgNodeId, to: CfgNodeId) {
self.remove_raw_directed_edge(from, to);
}
/// Connects the given two given nodes in the CFG
pub fn add_flow_edge(&mut self, from: CfgNodeId, to: CfgNodeId) {
self.add_raw_directed_edge(from, to);
}
/// Reduce the reducible nodes stored the queue at the time of adding nodes
pub fn reduce(&mut self, context: &WorkspaceContext, reduction_candidate: CfgNodeId) {
// Step 0: Remove the node that's being reduced
let cfg_node =
self.nodes.remove(&reduction_candidate).expect("Reduction candidate doesn't exist");
// Step 1: Get the predecessors
let predecessors = self.raw_predecessors(reduction_candidate);
// Step 2: Get the successors
let successors = self.raw_successors(reduction_candidate);
// Step 3: Remove existing predecessor relationships with reduction candidate to build new
// ones
for pred in &predecessors {
self.remove_flow_edge(*pred, cfg_node.id);
}
// Step 4: Remove existing predecessor relationships with reduction candidate to build new
// ones
for succ in &successors {
self.remove_flow_edge(cfg_node.id, *succ);
}
// Step 5: Get the (start s, end e) of the reduced cfg
let (start_id, end_id) = match cfg_node.nd {
// Voids and Primitives
CfgNodeDescriptor::Start(_)
| CfgNodeDescriptor::End(_)
| CfgNodeDescriptor::VariableDeclarationStatement(_)
| CfgNodeDescriptor::Break(_)
| CfgNodeDescriptor::Return(_)
| CfgNodeDescriptor::Continue(_)
| CfgNodeDescriptor::RevertStatement(_)
| CfgNodeDescriptor::PlaceholderStatement(_)
| CfgNodeDescriptor::InlineAssembly(_)
| CfgNodeDescriptor::TryStatement(_)
| CfgNodeDescriptor::EmitStatement(_)
| CfgNodeDescriptor::ExpressionStatement(_)
| CfgNodeDescriptor::WhileStatementCondition(_)
| CfgNodeDescriptor::ForStatementCondition(_)
| CfgNodeDescriptor::DoWhileStatementCondition(_)
| CfgNodeDescriptor::IfStatementCondition(_) => {
unreachable!("Expect only reducible nodes")
}
// Reducibles
CfgNodeDescriptor::Block(cfg_block) => cfg_block.reduce(context, self),
CfgNodeDescriptor::UncheckedBlock(cfg_block) => cfg_block.reduce(context, self),
CfgNodeDescriptor::IfStatement(cfg_block) => cfg_block.reduce(context, self),
CfgNodeDescriptor::WhileStatement(cfg_block) => cfg_block.reduce(context, self),
CfgNodeDescriptor::ForStatement(cfg_block) => cfg_block.reduce(context, self),
CfgNodeDescriptor::DoWhileStatement(cfg_block) => cfg_block.reduce(context, self),
};
// Step 6: Connect all the predecessors to `s`
for pred in &predecessors {
self.add_flow_edge(*pred, start_id);
}
// Step 7: Connect `e` to all the successors
for succ in &successors {
self.add_flow_edge(end_id, *succ);
}
// Step 8: Remove existing connections with reduction_candidate
self.remove_raw_edges_involving(reduction_candidate);
}
/// Corrects the flow of continue, break and return statements
///
/// This is hard to perform at the time of reduction so it must be done post-reduction.
///
/// Continue CFG Nodes should flow back the parent loop's condition node in case of a `while` or
/// `do while` and likewise to the parent loop's update expression in case of `for`.
///
/// Break CFG Nodes should always flow to the end of the parent loop
///
/// Return CFG Nodes should flow to the end of the function body or a modifier body
///
/// Arguments
///
/// * start_node - Node discovery starts here at this point.
///
/// * end_node - Return statements flow to here. It also serves as a fallback for break and
/// continue statements if parent loop is not found
pub fn calibrate_jump_statements_in_body(
&mut self,
start_node: CfgNodeId,
end_node: CfgNodeId,
) {
// Jump sources
let mut continue_statements = vec![];
let mut break_statements = vec![];
let mut return_statements = vec![];
let mut visited: HashSet<CfgNodeId> = Default::default();
// Start node sets the scope of discovery
discover_jump_sources(
self,
start_node,
&mut visited,
&mut continue_statements,
&mut break_statements,
&mut return_statements,
);
// Proposed Calibrations
let mut proposed_calibrations = vec![];
for continue_statement in continue_statements {
let mut visited = Default::default();
let dest = find_jump_dest(self, continue_statement, &mut visited).unwrap_or_default();
proposed_calibrations.push(Calibration::ContinueShouldFlowTo(continue_statement, dest));
}
for break_statement in break_statements {
let mut visited = Default::default();
let dest = find_jump_dest(self, break_statement, &mut visited).unwrap_or_default();
proposed_calibrations.push(Calibration::BreakShouldFlowTo(break_statement, dest));
}
for return_statement in return_statements {
proposed_calibrations.push(Calibration::ReturnShouldFlowToEndNode(return_statement));
}
// End node now comes into play
self.calibrate(proposed_calibrations, end_node);
}
pub fn find_ending_counter_part(&self, start_node_id: CfgNodeId) -> CfgNodeId {
*self.start_end_pairs.get(&start_node_id).expect("ending counter part not found!")
}
pub fn find_condition_node(&self, start_loop_id: CfgNodeId) -> CfgNodeId {
*self.start_cond_pairs.get(&start_loop_id).expect("could not resolve condition!")
}
pub fn find_loop_expression_node(&self, start_loop_id: CfgNodeId) -> CfgNodeId {
*self.start_loop_expr.get(&start_loop_id).expect("could not resolve loop_expression!")
}
}
impl Cfg {
/// Creates a new CFG from a given FunctionDefinition's body
///
/// * Returns - Tuple containing Cfg, Start Node, End Node
///
/// We don't yet have the ability to derive a CFG for the whole function because that involves
/// combining modifiers with the function body plus resolving internal functions, etc.
/// That's why the name here is from_function_body. We only create a CFG for the function's
/// body. It is static.
pub fn from_function_body(
context: &WorkspaceContext,
function_definition: &FunctionDefinition,
) -> Option<(Cfg, CfgNodeId, CfgNodeId)> {
// Verify that the function has a body
let function_body_block = function_definition.body.as_ref()?;
// Create an empty Cfg
let mut cfg = Self::new();
// Add the starters for function body
let start = cfg.add_start_function_body_node(function_definition.id);
let end = cfg.add_end_function_body_node(function_definition.id);
cfg.start_end_pairs.insert(start, end);
// Add the actual function body
let block = cfg.add_block_node(function_body_block);
// Connect the flow edges
cfg.add_flow_edge(start, block);
cfg.add_flow_edge(block, end);
// Reduction step (Standard thing to do after you assemble your Cfg skeleton)
while let Some(reduction_candidate) = cfg.reduction_queue.pop_front() {
cfg.reduce(context, reduction_candidate);
}
// Calibration step (Standard thing to do after you reduce your CFG)
cfg.calibrate_jump_statements_in_body(start, end);
// Return the CFG
Some((cfg, start, end))
}
/// Same as [`Self::from_function_body`] but for modifiers
pub fn from_modifier_body(
context: &WorkspaceContext,
modifier_definition: &ModifierDefinition,
) -> Option<(Cfg, CfgNodeId, CfgNodeId)> {
// Verify that the function has a body
let Some(modifier_body_block) = &modifier_definition.body else {
return None;
};
// Create an empty Cfg
let mut cfg = Self::new();
// Add the starters for function body
let start = cfg.add_start_modifier_body_node(modifier_definition.id);
let end = cfg.add_end_modifier_body_node(modifier_definition.id);
cfg.start_end_pairs.insert(start, end);
// Add the actual function body
let block = cfg.add_block_node(modifier_body_block);
// Connect the flow edges
cfg.add_flow_edge(start, block);
cfg.add_flow_edge(block, end);
// Reduction step (Standard thing to do after you assemble your Cfg skeleton)
while let Some(reduction_candidate) = cfg.reduction_queue.pop_front() {
cfg.reduce(context, reduction_candidate);
}
// Calibration step (Standard thing to do after you reduce your CFG)
cfg.calibrate_jump_statements_in_body(start, end);
// Return the CFG
Some((cfg, start, end))
}
}
// These methods help with recursion for detectors using the library
impl CfgNodeId {
pub fn children(&self, cfg: &Cfg) -> Vec<CfgNodeId> {
cfg.raw_successors(*self)
}
}
impl CfgNode {
pub fn children<'a>(&self, cfg: &'a Cfg) -> Vec<&'a CfgNode> {
let children_ids = cfg.raw_successors(self.id);
children_ids.into_iter().map(|c| cfg.nodes.get(&c).expect("cfg invalid!")).collect()
}
}
```
--------------------------------------------------------------------------------
/reports/hardhat-playground-report.md:
--------------------------------------------------------------------------------
```markdown
# Aderyn Analysis Report
This report was generated by [Aderyn](https://github.com/Cyfrin/aderyn), a static analysis tool built by [Cyfrin](https://cyfrin.io), a blockchain security company. This report is not a substitute for manual audit or security review. It should not be relied upon for any purpose other than to assist in the identification of potential security vulnerabilities.
# Table of Contents
- [Summary](#summary)
- [Files Summary](#files-summary)
- [Files Details](#files-details)
- [Issue Summary](#issue-summary)
- [High Issues](#high-issues)
- [H-1: `abi.encodePacked()` Hash Collision](#h-1-abiencodepacked-hash-collision)
- [H-2: `delegatecall` to an Arbitrary Address](#h-2-delegatecall-to-an-arbitrary-address)
- [H-3: Unchecked Low level calls](#h-3-unchecked-low-level-calls)
- [Low Issues](#low-issues)
- [L-1: `delegatecall` in loop](#l-1-delegatecall-in-loop)
- [L-2: `ecrecover` Signature Malleability](#l-2-ecrecover-signature-malleability)
- [L-3: Unsafe ERC20 Operation](#l-3-unsafe-erc20-operation)
- [L-4: Unspecific Solidity Pragma](#l-4-unspecific-solidity-pragma)
- [L-5: Address State Variable Set Without Checks](#l-5-address-state-variable-set-without-checks)
- [L-6: Public Function Not Used Internally](#l-6-public-function-not-used-internally)
- [L-7: PUSH0 Opcode](#l-7-push0-opcode)
- [L-8: Contract has TODO Comments](#l-8-contract-has-todo-comments)
- [L-9: Unused State Variable](#l-9-unused-state-variable)
- [L-10: Unused Import](#l-10-unused-import)
- [L-11: State Variable Could Be Constant](#l-11-state-variable-could-be-constant)
- [L-12: State Change Without Event](#l-12-state-change-without-event)
- [L-13: State Variable Could Be Immutable](#l-13-state-variable-could-be-immutable)
# Summary
## Files Summary
| Key | Value |
| --- | --- |
| .sol Files | 7 |
| Total nSLOC | 140 |
## Files Details
| Filepath | nSLOC |
| --- | --- |
| contracts/Counter.sol | 20 |
| contracts/ExtendedInheritance.sol | 17 |
| contracts/IContractInheritance.sol | 4 |
| contracts/InheritanceBase.sol | 8 |
| contracts/KeccakContract.sol | 21 |
| contracts/Lock.sol | 20 |
| contracts/StateVariables.sol | 50 |
| **Total** | **140** |
## Issue Summary
| Category | No. of Issues |
| --- | --- |
| High | 3 |
| Low | 13 |
# High Issues
## H-1: `abi.encodePacked()` Hash Collision
abi.encodePacked() should not be used with dynamic types when passing the result to a hash function such as `keccak256()`. Use `abi.encode()` instead which will pad items to 32 bytes, preventing hash collisions: https://docs.soliditylang.org/en/v0.8.13/abi-spec.html#non-standard-packed-mode. (e.g. `abi.encodePacked(0x123,0x456)` => `0x123456` => `abi.encodePacked(0x1,0x23456)`, but `abi.encode(0x123,0x456)` => `0x0...1230...456`). Unless there is a compelling reason, `abi.encode` should be preferred. If there is only one argument to `abi.encodePacked()` it can often be cast to `bytes()` or `bytes32()` instead: https://ethereum.stackexchange.com/questions/30912/how-to-compare-strings-in-solidity#answer-82739. If all arguments are strings and or bytes, `bytes.concat()` should be used instead.
<details><summary>3 Found Instances</summary>
- Found in contracts/KeccakContract.sol [Line: 18](../tests/hardhat-js-playground/contracts/KeccakContract.sol#L18)
```solidity
return keccak256(abi.encodePacked(a, b));
```
- Found in contracts/KeccakContract.sol [Line: 22](../tests/hardhat-js-playground/contracts/KeccakContract.sol#L22)
```solidity
return keccak256(abi.encodePacked(a, b));
```
- Found in contracts/KeccakContract.sol [Line: 26](../tests/hardhat-js-playground/contracts/KeccakContract.sol#L26)
```solidity
return keccak256(abi.encodePacked(a, b));
```
</details>
## H-2: `delegatecall` to an Arbitrary Address
Making a `delegatecall` to an arbitrary address without any checks is dangerous. Consider adding requirements on the target address.
<details><summary>1 Found Instances</summary>
- Found in contracts/ExtendedInheritance.sol [Line: 14](../tests/hardhat-js-playground/contracts/ExtendedInheritance.sol#L14)
```solidity
function doSomethingElse(address target) external {
```
</details>
## H-3: Unchecked Low level calls
The return value of the low-level call is not checked, so if the call fails, the Ether will be locked in the contract. If the low level is used to prevent blocking operations, consider logging failed calls. Ensure that the return value of a low-level call is checked or logged.
<details><summary>1 Found Instances</summary>
- Found in contracts/ExtendedInheritance.sol [Line: 16](../tests/hardhat-js-playground/contracts/ExtendedInheritance.sol#L16)
```solidity
target.delegatecall(abi.encodeWithSignature("doSomething(uint256)", i));
```
</details>
# Low Issues
## L-1: `delegatecall` in loop
Using `delegatecall` in loop may consume excessive gas, or worse, lead to more severe issues.
<details><summary>1 Found Instances</summary>
- Found in contracts/ExtendedInheritance.sol [Line: 15](../tests/hardhat-js-playground/contracts/ExtendedInheritance.sol#L15)
```solidity
for (uint256 i = 0; i < 3; i++) {
```
</details>
## L-2: `ecrecover` Signature Malleability
The `ecrecover` function is susceptible to signature malleability. This means that the same message can be signed in multiple ways, allowing an attacker to change the message signature without invalidating it. This can lead to unexpected behavior in smart contracts, such as the loss of funds or the ability to bypass access control. Consider using OpenZeppelin's ECDSA library instead of the built-in function.
<details><summary>1 Found Instances</summary>
- Found in contracts/ExtendedInheritance.sol [Line: 21](../tests/hardhat-js-playground/contracts/ExtendedInheritance.sol#L21)
```solidity
return ecrecover(theHash, v, r, s);
```
</details>
## L-3: Unsafe ERC20 Operation
ERC20 functions may not behave as expected. For example: return values are not always meaningful. It is recommended to use OpenZeppelin's SafeERC20 library.
<details><summary>1 Found Instances</summary>
- Found in contracts/Lock.sol [Line: 32](../tests/hardhat-js-playground/contracts/Lock.sol#L32)
```solidity
owner.transfer(address(this).balance);
```
</details>
## L-4: Unspecific Solidity Pragma
Consider using a specific version of Solidity in your contracts instead of a wide version. For example, instead of `pragma solidity ^0.8.0;`, use `pragma solidity 0.8.0;`
<details><summary>4 Found Instances</summary>
- Found in contracts/Counter.sol [Line: 2](../tests/hardhat-js-playground/contracts/Counter.sol#L2)
```solidity
pragma solidity ^0.8.13;
```
- Found in contracts/IContractInheritance.sol [Line: 2](../tests/hardhat-js-playground/contracts/IContractInheritance.sol#L2)
```solidity
pragma solidity >=0.8.0;
```
- Found in contracts/InheritanceBase.sol [Line: 2](../tests/hardhat-js-playground/contracts/InheritanceBase.sol#L2)
```solidity
pragma solidity ^0.8.0;
```
- Found in contracts/Lock.sol [Line: 2](../tests/hardhat-js-playground/contracts/Lock.sol#L2)
```solidity
pragma solidity ^0.8.20;
```
</details>
## L-5: Address State Variable Set Without Checks
Check for `address(0)` when assigning values to address state variables.
<details><summary>1 Found Instances</summary>
- Found in contracts/StateVariables.sol [Line: 58](../tests/hardhat-js-playground/contracts/StateVariables.sol#L58)
```solidity
addr = newAddr;
```
</details>
## L-6: Public Function Not Used Internally
If a function is marked public but is not used internally, consider marking it as `external`.
<details><summary>7 Found Instances</summary>
- Found in contracts/Counter.sol [Line: 7](../tests/hardhat-js-playground/contracts/Counter.sol#L7)
```solidity
function setNumber(uint256 newNumber) public {
```
- Found in contracts/Lock.sol [Line: 23](../tests/hardhat-js-playground/contracts/Lock.sol#L23)
```solidity
function withdraw() public {
```
- Found in contracts/StateVariables.sol [Line: 47](../tests/hardhat-js-playground/contracts/StateVariables.sol#L47)
```solidity
function setAddrNoZeroError(address newAddr) public {
```
- Found in contracts/StateVariables.sol [Line: 52](../tests/hardhat-js-playground/contracts/StateVariables.sol#L52)
```solidity
function setAddrNoZeroRequire(address newAddr) public {
```
- Found in contracts/StateVariables.sol [Line: 57](../tests/hardhat-js-playground/contracts/StateVariables.sol#L57)
```solidity
function setAddrNoCheck(address newAddr) public {
```
- Found in contracts/StateVariables.sol [Line: 61](../tests/hardhat-js-playground/contracts/StateVariables.sol#L61)
```solidity
function setEmptyAlteredNumbers(uint256 _emptyAlteredPrivateNumber, uint256 _emptyAlteredInternalNumber, uint256 _emptyAlteredPublicNumber) public {
```
- Found in contracts/StateVariables.sol [Line: 67](../tests/hardhat-js-playground/contracts/StateVariables.sol#L67)
```solidity
function setNonEmptyAlteredNumbers(uint256 _nonEmptyAlteredPrivateNumber, uint256 _nonEmptyAlteredInternalNumber, uint256 _nonEmptyAlteredPublicNumber) public {
```
</details>
## L-7: PUSH0 Opcode
Solc compiler version 0.8.20 switches the default target EVM version to Shanghai, which means that the generated bytecode will include PUSH0 opcodes. Be sure to select the appropriate EVM version in case you intend to deploy on a chain other than mainnet like L2 chains that may not support PUSH0, otherwise deployment of your contracts will fail.
<details><summary>7 Found Instances</summary>
- Found in contracts/Counter.sol [Line: 2](../tests/hardhat-js-playground/contracts/Counter.sol#L2)
```solidity
pragma solidity ^0.8.13;
```
- Found in contracts/ExtendedInheritance.sol [Line: 2](../tests/hardhat-js-playground/contracts/ExtendedInheritance.sol#L2)
```solidity
pragma solidity 0.8.20;
```
- Found in contracts/IContractInheritance.sol [Line: 2](../tests/hardhat-js-playground/contracts/IContractInheritance.sol#L2)
```solidity
pragma solidity >=0.8.0;
```
- Found in contracts/InheritanceBase.sol [Line: 2](../tests/hardhat-js-playground/contracts/InheritanceBase.sol#L2)
```solidity
pragma solidity ^0.8.0;
```
- Found in contracts/KeccakContract.sol [Line: 2](../tests/hardhat-js-playground/contracts/KeccakContract.sol#L2)
```solidity
pragma solidity 0.8.20;
```
- Found in contracts/Lock.sol [Line: 2](../tests/hardhat-js-playground/contracts/Lock.sol#L2)
```solidity
pragma solidity ^0.8.20;
```
- Found in contracts/StateVariables.sol [Line: 2](../tests/hardhat-js-playground/contracts/StateVariables.sol#L2)
```solidity
pragma solidity 0.8.20;
```
</details>
## L-8: Contract has TODO Comments
Contract contains comments with TODOS. Consider implementing or removing them.
<details><summary>1 Found Instances</summary>
- Found in contracts/Counter.sol [Line: 4](../tests/hardhat-js-playground/contracts/Counter.sol#L4)
```solidity
contract Counter {
```
</details>
## L-9: Unused State Variable
State variable appears to be unused. No analysis has been performed to see if any inline assembly references it. Consider removing this unused variable.
<details><summary>6 Found Instances</summary>
- Found in contracts/StateVariables.sol [Line: 8](../tests/hardhat-js-playground/contracts/StateVariables.sol#L8)
```solidity
uint256 private staticPrivateNumber;
```
- Found in contracts/StateVariables.sol [Line: 9](../tests/hardhat-js-playground/contracts/StateVariables.sol#L9)
```solidity
uint256 internal staticInternalNumber;
```
- Found in contracts/StateVariables.sol [Line: 13](../tests/hardhat-js-playground/contracts/StateVariables.sol#L13)
```solidity
uint256 private staticNonEmptyPrivateNumber = 1;
```
- Found in contracts/StateVariables.sol [Line: 14](../tests/hardhat-js-playground/contracts/StateVariables.sol#L14)
```solidity
uint256 internal staticNonEmptyInternalNumber = 2;
```
- Found in contracts/StateVariables.sol [Line: 28](../tests/hardhat-js-playground/contracts/StateVariables.sol#L28)
```solidity
uint256 private constant PRIVATE_CONSTANT = 1;
```
- Found in contracts/StateVariables.sol [Line: 29](../tests/hardhat-js-playground/contracts/StateVariables.sol#L29)
```solidity
uint256 internal constant INTERNAL_CONSTANT = 2;
```
</details>
## L-10: Unused Import
Redundant import statement. Consider removing it.
<details><summary>1 Found Instances</summary>
- Found in contracts/StateVariables.sol [Line: 4](../tests/hardhat-js-playground/contracts/StateVariables.sol#L4)
```solidity
import {Counter} from "./Counter.sol";
```
</details>
## L-11: State Variable Could Be Constant
State variables that are not updated following deployment should be declared constant to save gas. Add the `constant` attribute to state variables that never change.
<details><summary>3 Found Instances</summary>
- Found in contracts/StateVariables.sol [Line: 13](../tests/hardhat-js-playground/contracts/StateVariables.sol#L13)
```solidity
uint256 private staticNonEmptyPrivateNumber = 1;
```
- Found in contracts/StateVariables.sol [Line: 14](../tests/hardhat-js-playground/contracts/StateVariables.sol#L14)
```solidity
uint256 internal staticNonEmptyInternalNumber = 2;
```
- Found in contracts/StateVariables.sol [Line: 15](../tests/hardhat-js-playground/contracts/StateVariables.sol#L15)
```solidity
uint256 public staticNonEmptyPublicNumber = 3;
```
</details>
## L-12: State Change Without Event
There are state variable changes in this function but no event is emitted. Consider emitting an event to enable offchain indexers to track the changes.
<details><summary>10 Found Instances</summary>
- Found in contracts/Counter.sol [Line: 7](../tests/hardhat-js-playground/contracts/Counter.sol#L7)
```solidity
function setNumber(uint256 newNumber) public {
```
- Found in contracts/Counter.sol [Line: 11](../tests/hardhat-js-playground/contracts/Counter.sol#L11)
```solidity
function increment() public {
```
- Found in contracts/Counter.sol [Line: 16](../tests/hardhat-js-playground/contracts/Counter.sol#L16)
```solidity
function callIncrement() external {
```
- Found in contracts/Counter.sol [Line: 21](../tests/hardhat-js-playground/contracts/Counter.sol#L21)
```solidity
function incrementByTwoMagic() external {
```
- Found in contracts/Counter.sol [Line: 28](../tests/hardhat-js-playground/contracts/Counter.sol#L28)
```solidity
function incrementByTwoConstant() external {
```
- Found in contracts/StateVariables.sol [Line: 47](../tests/hardhat-js-playground/contracts/StateVariables.sol#L47)
```solidity
function setAddrNoZeroError(address newAddr) public {
```
- Found in contracts/StateVariables.sol [Line: 52](../tests/hardhat-js-playground/contracts/StateVariables.sol#L52)
```solidity
function setAddrNoZeroRequire(address newAddr) public {
```
- Found in contracts/StateVariables.sol [Line: 57](../tests/hardhat-js-playground/contracts/StateVariables.sol#L57)
```solidity
function setAddrNoCheck(address newAddr) public {
```
- Found in contracts/StateVariables.sol [Line: 61](../tests/hardhat-js-playground/contracts/StateVariables.sol#L61)
```solidity
function setEmptyAlteredNumbers(uint256 _emptyAlteredPrivateNumber, uint256 _emptyAlteredInternalNumber, uint256 _emptyAlteredPublicNumber) public {
```
- Found in contracts/StateVariables.sol [Line: 67](../tests/hardhat-js-playground/contracts/StateVariables.sol#L67)
```solidity
function setNonEmptyAlteredNumbers(uint256 _nonEmptyAlteredPrivateNumber, uint256 _nonEmptyAlteredInternalNumber, uint256 _nonEmptyAlteredPublicNumber) public {
```
</details>
## L-13: State Variable Could Be Immutable
State variables that are only changed in the constructor should be declared immutable to save gas. Add the `immutable` attribute to state variables that are only changed in the constructor
<details><summary>2 Found Instances</summary>
- Found in contracts/Lock.sol [Line: 8](../tests/hardhat-js-playground/contracts/Lock.sol#L8)
```solidity
uint public unlockTime;
```
- Found in contracts/Lock.sol [Line: 9](../tests/hardhat-js-playground/contracts/Lock.sol#L9)
```solidity
address payable public owner;
```
</details>
```
--------------------------------------------------------------------------------
/benchmarks/delegate-call-in-loop/report/regression.svg:
--------------------------------------------------------------------------------
```
<svg width="960" height="540" viewBox="0 0 960 540" xmlns="http://www.w3.org/2000/svg">
<text x="480" y="32" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="16.129032258064516" opacity="1" fill="#000000">
delegate-call-in-loop
</text>
<text x="27" y="263" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000" transform="rotate(270, 27, 263)">
Total sample time (ms)
</text>
<text x="510" y="513" dy="-0.5ex" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
Iterations (x 10^3)
</text>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="183" y1="472" x2="183" y2="53"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="289" y1="472" x2="289" y2="53"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="394" y1="472" x2="394" y2="53"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="499" y1="472" x2="499" y2="53"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="605" y1="472" x2="605" y2="53"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="710" y1="472" x2="710" y2="53"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="816" y1="472" x2="816" y2="53"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="921" y1="472" x2="921" y2="53"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="431" x2="932" y2="431"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="385" x2="932" y2="385"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="338" x2="932" y2="338"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="292" x2="932" y2="292"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="245" x2="932" y2="245"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="199" x2="932" y2="199"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="153" x2="932" y2="153"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="106" x2="932" y2="106"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="60" x2="932" y2="60"/>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="86,53 86,472 "/>
<text x="77" y="431" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
10.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,431 86,431 "/>
<text x="77" y="385" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
20.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,385 86,385 "/>
<text x="77" y="338" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
30.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,338 86,338 "/>
<text x="77" y="292" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
40.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,292 86,292 "/>
<text x="77" y="245" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
50.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,245 86,245 "/>
<text x="77" y="199" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
60.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,199 86,199 "/>
<text x="77" y="153" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
70.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,153 86,153 "/>
<text x="77" y="106" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
80.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,106 86,106 "/>
<text x="77" y="60" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
90.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,60 86,60 "/>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="87,473 932,473 "/>
<text x="183" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
1
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="183,473 183,478 "/>
<text x="289" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
2
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="289,473 289,478 "/>
<text x="394" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
3
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="394,473 394,478 "/>
<text x="499" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
4
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="499,473 499,478 "/>
<text x="605" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
5
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="605,473 605,478 "/>
<text x="710" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
6
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="710,473 710,478 "/>
<text x="816" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
7
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="816,473 816,478 "/>
<text x="921" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
8
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="921,473 921,478 "/>
<circle cx="87" cy="472" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="95" cy="465" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="104" cy="464" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="112" cy="461" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="121" cy="455" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="129" cy="452" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="138" cy="446" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="146" cy="444" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="155" cy="440" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="163" cy="435" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="172" cy="432" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="180" cy="427" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="189" cy="423" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="197" cy="418" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="206" cy="411" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="215" cy="405" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="223" cy="401" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="232" cy="388" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="240" cy="391" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="249" cy="381" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="257" cy="389" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="266" cy="382" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="274" cy="380" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="283" cy="379" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="291" cy="374" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="300" cy="369" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="308" cy="363" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="317" cy="361" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="325" cy="355" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="334" cy="347" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="343" cy="343" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="351" cy="343" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="360" cy="336" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="368" cy="332" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="377" cy="328" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="385" cy="323" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="394" cy="319" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="402" cy="315" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="411" cy="311" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="419" cy="305" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="428" cy="302" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="436" cy="298" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="445" cy="294" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="454" cy="289" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="462" cy="275" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="471" cy="282" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="479" cy="279" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="488" cy="273" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="496" cy="268" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="505" cy="263" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="513" cy="257" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="522" cy="263" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="530" cy="261" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="539" cy="255" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="547" cy="252" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="556" cy="236" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="564" cy="240" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="573" cy="234" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="582" cy="228" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="590" cy="222" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="599" cy="217" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="607" cy="214" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="616" cy="208" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="624" cy="205" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="633" cy="196" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="641" cy="204" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="650" cy="197" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="658" cy="191" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="667" cy="187" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="675" cy="183" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="684" cy="185" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="693" cy="181" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="701" cy="167" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="710" cy="167" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="718" cy="163" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="727" cy="158" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="735" cy="148" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="744" cy="140" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="752" cy="114" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="761" cy="129" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="769" cy="134" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="778" cy="132" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="786" cy="134" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="795" cy="121" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="803" cy="117" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="812" cy="108" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="821" cy="99" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="829" cy="105" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="838" cy="97" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="846" cy="93" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="855" cy="89" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="863" cy="85" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="872" cy="82" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="880" cy="89" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="889" cy="83" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="897" cy="70" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="906" cy="63" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="914" cy="54" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="923" cy="60" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="932" cy="53" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<polyline fill="none" opacity="1" stroke="#1F78B4" stroke-width="1" points="87,473 932,53 "/>
<polygon opacity="0.25" fill="#1F78B4" points="87,473 932,55 932,53 "/>
<text x="132" y="68" dy="0.76em" text-anchor="start" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
Sample
</text>
<text x="132" y="83" dy="0.76em" text-anchor="start" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
Linear regression
</text>
<text x="132" y="98" dy="0.76em" text-anchor="start" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
Confidence interval
</text>
<circle cx="112" cy="73" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<polyline fill="none" opacity="1" stroke="#1F78B4" stroke-width="2" points="102,88 122,88 "/>
<rect x="102" y="98" width="20" height="10" opacity="0.25" fill="#1F78B4" stroke="none"/>
</svg>
```
--------------------------------------------------------------------------------
/benchmarks/unindexed-events/report/regression.svg:
--------------------------------------------------------------------------------
```
<svg width="960" height="540" viewBox="0 0 960 540" xmlns="http://www.w3.org/2000/svg">
<text x="480" y="32" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="16.129032258064516" opacity="1" fill="#000000">
unindexed-events
</text>
<text x="27" y="263" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000" transform="rotate(270, 27, 263)">
Total sample time (ms)
</text>
<text x="510" y="513" dy="-0.5ex" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
Iterations (x 10^3)
</text>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="200" y1="472" x2="200" y2="53"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="322" y1="472" x2="322" y2="53"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="444" y1="472" x2="444" y2="53"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="566" y1="472" x2="566" y2="53"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="688" y1="472" x2="688" y2="53"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="810" y1="472" x2="810" y2="53"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="932" y1="472" x2="932" y2="53"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="435" x2="932" y2="435"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="393" x2="932" y2="393"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="352" x2="932" y2="352"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="310" x2="932" y2="310"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="268" x2="932" y2="268"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="227" x2="932" y2="227"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="185" x2="932" y2="185"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="144" x2="932" y2="144"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="102" x2="932" y2="102"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="60" x2="932" y2="60"/>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="86,53 86,472 "/>
<text x="77" y="435" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
10.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,435 86,435 "/>
<text x="77" y="393" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
20.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,393 86,393 "/>
<text x="77" y="352" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
30.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,352 86,352 "/>
<text x="77" y="310" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
40.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,310 86,310 "/>
<text x="77" y="268" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
50.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,268 86,268 "/>
<text x="77" y="227" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
60.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,227 86,227 "/>
<text x="77" y="185" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
70.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,185 86,185 "/>
<text x="77" y="144" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
80.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,144 86,144 "/>
<text x="77" y="102" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
90.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,102 86,102 "/>
<text x="77" y="60" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
100.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,60 86,60 "/>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="87,473 932,473 "/>
<text x="200" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
0.5
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="200,473 200,478 "/>
<text x="322" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
1
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="322,473 322,478 "/>
<text x="444" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
1.5
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="444,473 444,478 "/>
<text x="566" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
2
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="566,473 566,478 "/>
<text x="688" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
2.5
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="688,473 688,478 "/>
<text x="810" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
3
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="810,473 810,478 "/>
<text x="932" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
3.5
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="932,473 932,478 "/>
<circle cx="87" cy="472" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="95" cy="468" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="104" cy="463" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="112" cy="461" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="121" cy="456" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="129" cy="452" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="138" cy="449" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="146" cy="445" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="155" cy="441" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="163" cy="437" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="172" cy="432" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="180" cy="429" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="189" cy="424" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="197" cy="421" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="206" cy="416" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="215" cy="412" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="223" cy="409" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="232" cy="402" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="240" cy="400" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="249" cy="396" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="257" cy="392" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="266" cy="382" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="274" cy="374" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="283" cy="364" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="291" cy="342" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="300" cy="351" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="308" cy="353" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="317" cy="347" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="325" cy="322" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="334" cy="342" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="343" cy="349" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="351" cy="347" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="360" cy="342" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="368" cy="338" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="377" cy="334" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="385" cy="330" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="394" cy="325" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="402" cy="319" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="411" cy="318" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="419" cy="314" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="428" cy="308" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="436" cy="304" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="445" cy="299" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="454" cy="297" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="462" cy="293" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="471" cy="288" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="479" cy="285" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="488" cy="282" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="496" cy="279" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="505" cy="276" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="513" cy="274" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="522" cy="267" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="530" cy="247" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="539" cy="230" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="547" cy="242" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="556" cy="237" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="564" cy="236" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="573" cy="237" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="582" cy="233" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="590" cy="226" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="599" cy="224" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="607" cy="221" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="616" cy="216" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="624" cy="212" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="633" cy="208" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="641" cy="203" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="650" cy="197" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="658" cy="193" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="667" cy="188" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="675" cy="189" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="684" cy="185" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="693" cy="178" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="701" cy="175" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="710" cy="173" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="718" cy="170" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="727" cy="162" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="735" cy="167" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="744" cy="168" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="752" cy="155" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="761" cy="126" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="769" cy="126" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="778" cy="117" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="786" cy="122" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="795" cy="131" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="803" cy="126" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="812" cy="117" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="821" cy="114" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="829" cy="115" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="838" cy="109" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="846" cy="105" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="855" cy="99" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="863" cy="98" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="872" cy="93" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="880" cy="76" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="889" cy="83" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="897" cy="78" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="906" cy="74" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="914" cy="67" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="923" cy="62" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="932" cy="53" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<polyline fill="none" opacity="1" stroke="#1F78B4" stroke-width="1" points="87,473 932,60 "/>
<polygon opacity="0.25" fill="#1F78B4" points="87,473 932,62 932,58 "/>
<text x="132" y="68" dy="0.76em" text-anchor="start" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
Sample
</text>
<text x="132" y="83" dy="0.76em" text-anchor="start" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
Linear regression
</text>
<text x="132" y="98" dy="0.76em" text-anchor="start" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
Confidence interval
</text>
<circle cx="112" cy="73" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<polyline fill="none" opacity="1" stroke="#1F78B4" stroke-width="2" points="102,88 122,88 "/>
<rect x="102" y="98" width="20" height="10" opacity="0.25" fill="#1F78B4" stroke="none"/>
</svg>
```
--------------------------------------------------------------------------------
/benchmarks/useless-internal-function/report/regression.svg:
--------------------------------------------------------------------------------
```
<svg width="960" height="540" viewBox="0 0 960 540" xmlns="http://www.w3.org/2000/svg">
<text x="480" y="32" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="16.129032258064516" opacity="1" fill="#000000">
useless-internal-function
</text>
<text x="27" y="263" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000" transform="rotate(270, 27, 263)">
Total sample time (ms)
</text>
<text x="510" y="513" dy="-0.5ex" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
Iterations (x 10^3)
</text>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="218" y1="472" x2="218" y2="53"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="358" y1="472" x2="358" y2="53"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="498" y1="472" x2="498" y2="53"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="638" y1="472" x2="638" y2="53"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="778" y1="472" x2="778" y2="53"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="918" y1="472" x2="918" y2="53"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="439" x2="932" y2="439"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="400" x2="932" y2="400"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="362" x2="932" y2="362"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="324" x2="932" y2="324"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="286" x2="932" y2="286"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="248" x2="932" y2="248"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="210" x2="932" y2="210"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="171" x2="932" y2="171"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="133" x2="932" y2="133"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="95" x2="932" y2="95"/>
<line opacity="0.2" stroke="#000000" stroke-width="1" x1="87" y1="57" x2="932" y2="57"/>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="86,53 86,472 "/>
<text x="77" y="439" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
10.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,439 86,439 "/>
<text x="77" y="400" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
20.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,400 86,400 "/>
<text x="77" y="362" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
30.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,362 86,362 "/>
<text x="77" y="324" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
40.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,324 86,324 "/>
<text x="77" y="286" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
50.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,286 86,286 "/>
<text x="77" y="248" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
60.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,248 86,248 "/>
<text x="77" y="210" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
70.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,210 86,210 "/>
<text x="77" y="171" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
80.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,171 86,171 "/>
<text x="77" y="133" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
90.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,133 86,133 "/>
<text x="77" y="95" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
100.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,95 86,95 "/>
<text x="77" y="57" dy="0.5ex" text-anchor="end" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
110.0
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="81,57 86,57 "/>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="87,473 932,473 "/>
<text x="218" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
1
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="218,473 218,478 "/>
<text x="358" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
2
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="358,473 358,478 "/>
<text x="498" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
3
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="498,473 498,478 "/>
<text x="638" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
4
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="638,473 638,478 "/>
<text x="778" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
5
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="778,473 778,478 "/>
<text x="918" y="483" dy="0.76em" text-anchor="middle" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
6
</text>
<polyline fill="none" opacity="1" stroke="#000000" stroke-width="1" points="918,473 918,478 "/>
<circle cx="87" cy="472" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="95" cy="465" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="104" cy="463" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="112" cy="462" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="121" cy="456" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="129" cy="452" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="138" cy="451" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="146" cy="446" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="155" cy="443" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="163" cy="439" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="172" cy="437" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="180" cy="432" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="189" cy="428" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="197" cy="426" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="206" cy="421" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="215" cy="379" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="223" cy="409" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="232" cy="391" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="240" cy="375" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="249" cy="401" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="257" cy="399" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="266" cy="395" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="274" cy="388" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="283" cy="372" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="291" cy="377" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="300" cy="379" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="308" cy="374" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="317" cy="371" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="325" cy="370" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="334" cy="356" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="343" cy="361" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="351" cy="359" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="360" cy="354" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="368" cy="349" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="377" cy="347" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="385" cy="271" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="394" cy="195" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="402" cy="297" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="411" cy="308" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="419" cy="320" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="428" cy="321" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="436" cy="300" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="445" cy="319" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="454" cy="311" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="462" cy="310" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="471" cy="310" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="479" cy="301" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="488" cy="284" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="496" cy="276" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="505" cy="285" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="513" cy="292" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="522" cy="291" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="530" cy="287" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="539" cy="284" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="547" cy="279" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="556" cy="277" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="564" cy="269" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="573" cy="248" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="582" cy="247" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="590" cy="238" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="599" cy="254" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="607" cy="243" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="616" cy="245" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="624" cy="240" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="633" cy="220" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="641" cy="219" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="650" cy="229" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="658" cy="222" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="667" cy="222" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="675" cy="220" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="684" cy="217" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="693" cy="204" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="701" cy="205" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="710" cy="196" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="718" cy="193" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="727" cy="193" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="735" cy="195" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="744" cy="194" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="752" cy="182" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="761" cy="179" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="769" cy="179" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="778" cy="180" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="786" cy="176" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="795" cy="174" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="803" cy="178" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="812" cy="171" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="821" cy="171" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="829" cy="170" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="838" cy="167" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="846" cy="164" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="855" cy="158" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="863" cy="140" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="872" cy="121" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="880" cy="129" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="889" cy="122" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="897" cy="125" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="906" cy="122" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="914" cy="53" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="923" cy="105" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<circle cx="932" cy="110" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<polyline fill="none" opacity="1" stroke="#1F78B4" stroke-width="1" points="87,473 932,103 "/>
<polygon opacity="0.25" fill="#1F78B4" points="87,473 932,108 932,96 "/>
<text x="132" y="68" dy="0.76em" text-anchor="start" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
Sample
</text>
<text x="132" y="83" dy="0.76em" text-anchor="start" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
Linear regression
</text>
<text x="132" y="98" dy="0.76em" text-anchor="start" font-family="sans-serif" font-size="9.67741935483871" opacity="1" fill="#000000">
Confidence interval
</text>
<circle cx="112" cy="73" r="3" opacity="1" fill="#1F78B4" stroke="none" stroke-width="1"/>
<polyline fill="none" opacity="1" stroke="#1F78B4" stroke-width="2" points="102,88 122,88 "/>
<rect x="102" y="98" width="20" height="10" opacity="0.25" fill="#1F78B4" stroke="none"/>
</svg>
```