thehardwarestore.ai

where AI agents shop for the right tools

── 98857 repos indexed ── | filtered by tag: static-analysis
rust-lang/rust ★ 119277 17052 APPLICATION

This repository is the main source code for the Rust programming language compiler (rustc) and its standard library. It is a monorepo containing the compiler, standard library (core, alloc, std), and development tools (clippy linter, miri interpreter, rustfmt formatter, rust-analyzer, rustdoc documentation generator). The compiler is implemented as a collection of Rust crates under compiler/, each handling a specific phase: lexing, parsing, AST construction, HIR lowering, type inference, borrow checking, MIR optimization, and code generation (LLVM, GCC, Cranelift backends). The architecture is modular with well-defined interfaces between phases, enabling incremental compilation and separate development of backends. The primary entry point is compiler/rustc/src/main.rs, which drives the compilation pipeline. Source code flows through the lexer, parser, AST, HIR, MIR, and finally to code generation. The borrow checker (rustc_borrowck) performs region-based static analysis for memory safety. The type inference engine (rustc_infer) handles complex type relationships including generics, traits, and higher-ranked types. The MIR optimization framework (rustc_mir_transform) applies numerous passes such as constant propagation, dead store elimination, and GVN. External dependencies include LLVM for the primary code generation backend, libgccjit for the GCC backend, and various system libraries for platform-specific functionality. The standard library provides OS abstractions, synchronization primitives, I/O, and collections. The repository also includes extensive test suites (tests/) covering compiler diagnostics, code generation, optimization, and tool behavior.

RATING: 9.9/10 MAINT: active DRIFT: low
▸ 5 reusable components found
colbymchenry/codegraph ★ 73135 4694 APPLICATION

CodeGraph is a local-first, cross-language code intelligence engine designed to give AI coding agents structured knowledge of a codebase: symbols, references, call graphs, import graphs, inheritance, routes, and framework-specific dynamic dispatch. It indexes source with tree-sitter WASM grammars (or an optional native Rust kernel for speed), stores the resulting graph in SQLite with FTS5, then resolves cross-file references and synthesizes edges for indirect patterns like web frameworks, DI containers, callbacks, and event dispatch. The primary interfaces are a CLI (codegraph), an MCP server exposing tools for agents, an embeddable programmatic API, and a Svelte web viewer.

RATING: 9.9/10 MAINT: active DRIFT: low
▸ 6 reusable components found
astral-sh/ruff ★ 49808 2445 APPLICATION

This repository contains the Ruff Python linter and formatter, along with the Ty Python type checker, both written in Rust. It is a monolith of several dozen crates assembled into a workspace, delivering a CLI tool, a Language Server Protocol (LSP) server, and a web playground. In production, Ruff analyzes Python source files against hundreds of lint rules from flake8, pylint, pyupgrade, and other plugins, formats code to be compatible with Black, and provides IDE features via LSP. Ty adds type checking and advanced IDE features like goto-definition and workspace symbols. The architecture is modular: a parser produces an AST, semantic analysis operates on that AST, lint rules are checked via pluggable visitors, formatting is done through an IR-based printer, and diagnostics are rendered in multiple formats (JSON, JUnit, SARIF, etc.). The LSP server reuses many of these components through a Salsa-based incremental database for caching. The repository is a model of how to structure a high-performance developer tool in Rust, with extensive test fixtures, fuzzing, and benchmarks. While primarily an application, it includes some data-like assets (test fixture corpora, ecosystem check scripts) but nothing that would classify it as a data research project.

RATING: 9.9/10 MAINT: active DRIFT: low
▸ 6 reusable components found
llvm/llvm-project ★ 39817 18277 APPLICATION

The LLVM Project is a comprehensive compiler infrastructure and toolchain ecosystem, serving as the foundational layer for modern C/C++ compilation, optimization, and debugging. It operates as a monolithic monorepo containing distinct but tightly integrated sub-projects: Clang (frontend), LLVM (backend IR and optimizer), LLDB (debugger), MLIR (multi-level intermediate representation), and compiler-rt (runtime libraries). The system's primary function is to transform source code into optimized machine code while providing robust tooling for static analysis, dynamic instrumentation (sanitizers), and debugging. It supports a vast array of architectures (x86, ARM, RISC-V, etc.) and languages (C, C++, OpenMP, SYCL), making it a critical piece of infrastructure for high-performance computing and systems programming. Despite its complexity, the codebase maintains exceptional craftsmanship through rigorous testing and modular design. The architecture relies heavily on a custom testing framework (Lit) and a strict review process, ensuring that low-level optimizations and standard library implementations remain correct across platforms. The project is not a data pipeline or research notebook collection; rather, it is a production-grade software engineering toolset that defines industry standards for compiler correctness and performance. Key data flows involve source code ingestion through Clang's frontend, transformation into LLVM IR, optimization passes within the LLVM backend, and final code generation for specific targets. External dependencies include CMake for build configuration, Python for tooling scripts, and various system libraries for runtime support. The repository is actively maintained with frequent commits, reflecting its role as a leading-edge technology in the software development ecosystem.

RATING: 9.9/10 MAINT: active DRIFT: low
▸ 4 reusable components found
WebAssembly/binaryen ★ 8653 895 APPLICATION

Binaryen is a production-grade compiler and toolchain infrastructure library for WebAssembly, written in C++. It provides a comprehensive intermediate representation (IR) that closely mirrors the WebAssembly specification, enabling fast conversion to and from binary and text formats. The system includes a modular optimization pass framework with over 100 passes covering dead code elimination, type refinement, inlining, constant propagation, GC-specific optimizations, and more. It also features a WebAssembly-to-JavaScript compiler (wasm2js), a full interpreter for constant evaluation and spec testing, and a rich set of command-line tools (wasm-opt, wasm-as, wasm-dis, wasm-merge, wasm-split, wasm-reduce, wasm-ctor-eval, etc.). The architecture is centered on a tree-structured IR with walker-based traversal patterns, a generic lattice-based static analysis framework, and a parallel pass execution engine. External dependencies include LLVM (for DWARF support) and FP16 (for half-precision floating point), but the core is self-contained. The codebase is actively maintained, tracks all major WebAssembly proposals (GC, Strings, SIMD, Tail Calls, Exception Handling, Stack Switching), and is used by Emscripten, wasm-pack, J2CL, Dart/Flutter, Kotlin/Wasm, and other toolchains.

RATING: 9.9/10 MAINT: active DRIFT: low
▸ 5 reusable components found
GaijinEntertainment/go-exhaustruct ★ 207 23 APPLICATION

exhaustruct is a Go static analysis tool that finds struct literals with uninitialized fields. It operates as a standalone CLI tool or as an integrated linter within golangci-lint. The analyzer inspects all composite literals in Go source code, resolves their types using go/types, and reports missing field initializations based on configurable rules: comment directives (//exhaustruct:optional, :ignore, :enforce), regex patterns for type inclusion/exclusion, and various flags for allowing empty literals in specific contexts (returns, declarations, blank assignments). It supports both implicit (check all) and explicit (opt-in) modes, and provides automatic migration from deprecated struct tags to comment directives. The architecture is modular and highly crafted: the analyzer package orchestrates inspection, while internal packages handle caching, pattern matching, directive scanning, AST file parsing with correct handling of //line directives, and struct metadata resolution with promotion indexing for composite literals that name promoted fields (Go 1.27+). The codebase demonstrates exceptional attention to edge cases: concurrent access to shared caches, type parameter constraint resolution for generic structs, proper handling of embedded fields across packages, version-gated promotion resolution, and robust diagnostic generation with suggested fixes for tag migration. The implementation is production-ready with comprehensive test coverage including benchmarks, race detection, and dogfooding (running exhaustruct on its own code). The internal cache package provides a generic GetOrSet with once-only computation semantics that could be reused in other projects, and the pattern list offers full-string matching with alternation-aware longest match. The code is well-documented, with clear separation of concerns and thorough testing of all directive combinations and edge cases.

RATING: 9.9/10 MAINT: maintained DRIFT: low
▸ 4 reusable components found
checkstyle/checkstyle ★ 9601 4279 APPLICATION

Checkstyle is a production-grade Java static analysis library and CLI tool that enforces configurable coding standards. In operation, it reads Java source files (and related resources like property files, package-info, and HTML docs), parses them with an ANTLR-based Java and Javadoc grammar, builds a concrete syntax tree, and traverses it through a Checker/TreeWalker pipeline. Individual checks are modular and validate naming, whitespace, imports, Javadoc, coding practices, design, metrics, and more. Violations flow through configurable filters - including comment-based suppression, @SuppressWarnings, and XPath-based suppression - and are emitted by pluggable loggers for plain text, XML, or SARIF output. The project also ships a CLI for AST printing, XPath query generation, and suppression file generation, plus an Ant task integration.

RATING: 9.8/10 MAINT: active DRIFT: low
▸ 3 reusable components found
ifandelse/machina.js ★ 1970 144 APPLICATION

Machina.js is a TypeScript-first finite state machine library that provides both single-client and multi-client FSM implementations. It features hierarchical state machines with event bubbling, deferred input processing, lifecycle hooks, and a built-in event system. The library includes static analysis tools for detecting unreachable states and transition loops, testing utilities with custom matchers, React integration hooks, and an ESLint plugin for FSM validation. Built as a monorepo with pnpm and turbo, it emphasizes type safety and compile-time validation of state configurations.

RATING: 9.8/10 MAINT: active DRIFT: low
▸ 5 reusable components found
abhigyanpatwari/GitNexus ★ 47615 5180 APPLICATION

GitNexus is a graph-powered code intelligence platform that indexes any codebase into a knowledge graph, then exposes it through MCP tools and a web UI. It supports 14+ languages with deep scope-based resolution (RFC #909), cross-file type inference, control-flow graphs (CFG), program dependence graphs (PDG), taint analysis, and hybrid search (BM25 + semantic + RRF). The system has two main components: a CLI/MCP server (Node.js) for AI agent integration with tools like Cursor, Claude Code, and Codex; and a web UI (React + Vite) for visual graph exploration. The architecture is a multi-phase ingestion pipeline: scan → structure → parse → scope resolution → clustering → process detection → search indexing. The codebase demonstrates strong engineering with comprehensive test coverage (1100+ tests), a shared types package (gitnexus-shared), vendored tree-sitter grammars with prebuilt binaries, Docker containerization with cosign signing, and CI/CD with security scanning. The eval harness for SWE-bench evaluation shows research-grade rigor. Key architectural decisions include the registry-primary scope resolution system, the language provider pattern with compile-time exhaustive dispatch, and the worker pool for parallel parsing with self-healing capabilities.

RATING: 9.7/10 MAINT: active DRIFT: low
▸ 8 reusable components found
eslint/eslint ★ 27532 5201 APPLICATION

ESLint is a mature, widely-used static analysis tool for JavaScript and TypeScript. It operates as both a CLI tool and a programmatic library, parsing source code into an AST and applying a configurable set of lint rules to detect and fix code quality, style, and correctness issues. The architecture is modular: a core linter (`lib/linter/linter.js`) orchestrates parsing (via espree or custom parsers), rule execution, and fix application; a configuration system (`lib/config/`) resolves flat config files; and a CLI engine (`lib/cli.js`) handles command-line invocation, file globbing, and result formatting. Key entry points include `bin/eslint.js` (CLI), `lib/api.js` (public API exposing `ESLint`, `Linter`, `RuleTester`, `SourceCode`), and `lib/universal.js` (browser-compatible Linter). Data flows: source files are read, parsed into ASTs, traversed by rule visitors, and lint messages are collected, filtered, and formatted. External dependencies include espree (parser), eslint-scope (scope analysis), eslint-visitor-keys, and various community utilities. The codebase is self-hosting, using its own rules and config for development, and includes extensive test suites, fuzzing tools, and ecosystem regression testing.

RATING: 9.6/10 MAINT: active DRIFT: low
▸ 5 reusable components found
vuejs/eslint-plugin-vue ★ 4592 720 APPLICATION

eslint-plugin-vue is an ESLint plugin specifically designed for linting Vue.js single-file components (SFCs). It provides over 100 rules covering template syntax, script setup, Options API, Composition API, and Vue-specific best practices. The architecture follows standard ESLint plugin patterns with rule implementations in lib/rules/, shareable configurations in lib/configs/ (both legacy and Flat Config formats), and a processor for handling .vue files. Key entry points include the main plugin export (lib/index.ts), the processor (lib/processor.ts), and utility modules (lib/utils/) that provide AST traversal helpers, scope analysis, and component introspection. The plugin relies on peer dependencies eslint and vue-eslint-parser, with optional TypeScript support via @typescript-eslint/parser. It demonstrates strong craftsmanship through well-tested rules, comprehensive documentation, and active maintenance for both Vue 2 and Vue 3 ecosystems.

RATING: 9.6/10 MAINT: active DRIFT: low
▸ 1 reusable components found
sebastianbergmann/php-code-coverage ★ 8923 385 APPLICATION

This is the official PHP code coverage library (`phpunit/php-code-coverage`) used by PHPUnit to collect, process, and render code coverage information. It provides a programmatic API for starting/stopping coverage collection via Xdebug or PCOV drivers, filtering by files and test targets, and generating reports in multiple formats: HTML (with line, branch, and path coverage views, control flow graphs, and test-size filtering), XML, Clover, OpenClover, Cobertura, Crap4j, JSONL, and plain text. The library includes a sophisticated static analysis subsystem based on `nikic/php-parser` that identifies executable lines, dead code, ignored lines, and code units (classes, methods, functions, traits, interfaces). It supports serialization and merging of coverage data from parallel test processes, with strict version and environment validation. The architecture is modular with clear separation between data collection (drivers), processing (filtering, static analysis, node tree building), and rendering (multiple report generators). The codebase is well-tested with extensive golden-file comparisons and property-based tests for static analysis visitors.

RATING: 9.5/10 MAINT: active DRIFT: low
▸ 5 reusable components found
koalaman/shellcheck ★ 40098 1951 APPLICATION

ShellCheck is a static analysis tool for shell scripts, written in Haskell. It parses shell scripts (Bash, sh, dash, ksh, busybox) into an Abstract Syntax Tree (AST), constructs a Control Flow Graph (CFG), and performs Data Flow Analysis (DFA) to detect syntax errors, semantic bugs, security vulnerabilities, and portability issues. The tool operates as a CLI executable with a modular architecture that separates parsing, analysis, and output formatting. It integrates into CI/CD pipelines and editor plugins via standardized output formats (JSON, GCC, CheckStyle, Diff). The core logic is encapsulated in the ShellCheck library, allowing reuse in other tools or environments. The architecture follows a functional programming paradigm, leveraging Haskell's type system and monads for state management during analysis. The data flow is linear: source text -> Parser (AST) -> CFG Builder -> Data Flow Analysis -> Checker (Rules) -> Formatter (Output). External dependencies are primarily Haskell ecosystem packages (Parsec, aeson, QuickCheck, regex-tdfa). The tool supports configuration via `.shellcheckrc` files and inline directives, enabling customization of checks and shell dialects. ShellCheck is widely adopted in the DevOps and SRE communities, evidenced by its high star count and active issue tracking. It is designed for automation, with non-interactive parsing and configuration-driven behavior. The codebase demonstrates high craftsmanship in its handling of complex shell syntax and stateful analysis, though it maintains some legacy patterns like manual ST monad state management for performance optimization.

RATING: 9.4/10 MAINT: active DRIFT: low
▸ 3 reusable components found
TypeStrong/typedoc ★ 8451 779 APPLICATION

TypeDoc is a sophisticated documentation generator for TypeScript projects. It parses TypeScript source code using the TypeScript compiler API, extracts JSDoc/TSDoc comments, and produces both JSON model serializations and fully-featured HTML documentation sites with search, navigation, themes, and internationalization. The system operates as a CLI tool and a programmable library, featuring a plugin architecture with converter plugins, renderer plugins, and serialization components that hook into a well-defined event lifecycle. The architecture is modular: a converter transforms the TypeScript AST into an internal reflection model, the renderer produces output via themes and routers, and a serialization layer supports JSON round-tripping for caching and merging. The codebase demonstrates advanced TypeScript patterns including a custom JSX factory for rendering, a type model hierarchy with a visitor pattern, a comprehensive options system with declarative definitions and multiple readers, and a stable event system. There are no data/research elements; this is a pure application tool.

RATING: 9.4/10 MAINT: active DRIFT: low
▸ 4 reusable components found
include-what-you-use/include-what-you-use ★ 4763 432 APPLICATION

include-what-you-use (IWYU) is a Clang-based static analysis tool for C/C++ that enforces minimal and correct `#include` directives. It analyzes every symbol used in a translation unit and ensures that the file directly includes the header that provides that symbol, suggesting removal of unused includes and addition of missing ones. The tool is designed for integration into build systems (e.g., CMake, Make, or via a compilation database driver) and can generate automatic fixes through its companion script `fix_includes.py`. The architecture is a pipeline: the Clang preprocessor and AST callbacks (`IwyuPreprocessorInfo`, `IwyuAstConsumer`) track macro expansions, symbol references, and template instantiations. A core component is the `IncludePicker` which maintains a large built-in map of symbol-to-header and private-to-public header mappings (for libc, libstdc++, libc++, Clang builtins) and supports user-supplied mapping files in YAML/JSON format. The analysis output is structured text that `fix_includes.py` parses to rewrite source files. The codebase is thoroughly tested with hundreds of small regression tests and a large monolithic test (`badinc.cc`), plus unit tests for internal utilities. IWYU is tightly coupled to Clang's AST and preprocessor APIs, requiring regular updates to track Clang mainline. Despite this, the project maintains a sophisticated handling of C++ complexities: templates, alias templates, forward declarations, macros, inline namespaces, and pragmas for manual override. The mapping system is extensible and includes generators for popular libraries (Boost, Qt, Python, Windows SDK). The tool is mature enough for production use in large codebases, though it acknowledges some known limitations (marked as `IWYU_XFAIL` tests).

RATING: 9.4/10 MAINT: active DRIFT: low
▸ 2 reusable components found
typeddjango/django-stubs ★ 1973 569 APPLICATION

django-stubs is a distribution package of type stubs (`.pyi` files) that mirror the entire Django web framework API, combined with a custom mypy plugin (`mypy_django_plugin`) that provides deep runtime-aware type inference for patterns the stubs alone cannot handle (e.g., queryset `values()` returning dynamically typed dicts, manager methods tied to concrete model classes, and AUTH_USER_MODEL substitution). The package also includes a companion runtime extension (`django-stubs-ext`) that monkey-patches Python's `__class_getitem__` onto Django classes and supplies helper types like `WithAnnotations` and `QuerySetAny` for static analysis. The architecture is split into three layers: (1) the static stub files that define public signatures for almost every Django module, (2) the mypy plugin that hooks into mypy's semantic analysis to resolve model fields, relations, and query expressions at the type level, and (3) the extension package that enables runtime generic subscripting for compatibility with modern type hints. Development tooling includes a YAML-based test harness (`tests/typecheck/`) that allows testing type inference across mypy, pyright, pyrefly, and ty, plus a `stubtest` script to detect drift between the stubs and Django's actual runtime. The project has a strong emphasis on correctness: CI runs against multiple Django versions (5.2–6.1) and Python versions, uses `mypy_primer` to catch regressions on real-world Django projects, and maintains an allowlist of known stub–runtime discrepancies. It is the de-facto standard for type-checking Django projects and is actively maintained by the TypedDjango organization.

RATING: 9.4/10 MAINT: active DRIFT: low
▸ 4 reusable components found
PyCQA/bandit ★ 8318 860 APPLICATION

Bandit is a well-established Python security linter that performs static analysis by parsing source code into ASTs and running a configurable set of plugins against AST nodes. It is primarily a CLI tool, but also exposes a plugin architecture for custom checks and formatters via setuptools entry points. Key entry points include the main CLI (bandit.cli.main), baseline comparison utility (bandit.cli.baseline), and config generator (bandit.cli.config_generator). The core engine (bandit/core/manager.py, node_visitor.py, context.py) orchestrates file discovery, AST traversal, test execution, and result aggregation. It supports multiple output formats (JSON, SARIF, CSV, HTML, XML, YAML, text, screen) and integrates with CI/CD pipelines, pre-commit hooks, and Git via .bandit files. The project is actively maintained, supports Python 3.10+, and has extensive test coverage, though some legacy config conversion code and removed test IDs (e.g., B309, B320) indicate minor drift. Bandit is a reference implementation for a plugin-based security linter with a clean separation between core, plugins, and formatters.

RATING: 9.3/10 MAINT: active DRIFT: low
▸ 4 reusable components found
reviewdog/reviewdog ★ 9660 503 APPLICATION

reviewdog is a Go CLI that bridges linter output to code review platforms. It consumes diagnostic output from any linter or compiler via stdin in multiple formats — Vim errorformat, SARIF 2.1.0, Checkstyle XML, the project's own RDJSON/RDJSONL protobuf-defined format, or raw unified diff — parses it, filters findings against a code diff so only issues on changed lines get posted, and reports them to GitHub (check runs, PR reviews, annotations), GitLab MRs, Bitbucket, Gerrit, or Gitea, or writes them locally in text, RDJSON, or SARIF form. The core architecture is a set of loosely coupled Go packages: parser/ for format decoders, diff/ for unified diff parsing, filter/ for diff-aware result filtering, service/ for per-platform comment and diff API clients, cienv/ for CI context detection, and project/ for executing multi-runner .reviewdog.yml configs. The CLI entry point is cmd/reviewdog/main.go, with orchestration in reviewdog.go around the CommentService and DiffService interfaces; command flow is: subprocess or stdin -> parser -> ResultMap -> diff filter -> reporter service -> host-platform API.

RATING: 9.2/10 MAINT: active DRIFT: low
▸ 5 reusable components found
securego/gosec ★ 8972 718 APPLICATION

gosec is a production-grade static analysis security scanner for Go source code. It analyzes Go programs by traversing the AST and SSA representations to detect a wide range of security vulnerabilities, including SQL injection, command injection, path traversal, cross-site scripting (XSS), hardcoded credentials, weak cryptography, TLS misconfigurations, and more. The tool is distributed as a CLI binary, a Docker image, a GitHub Action, and a reusable Go library. The architecture is modular: a core analysis engine loads Go packages, applies AST-based rules and SSA-based analyzers, and runs a configurable taint analysis engine that tracks data flow from user-controlled sources to dangerous sinks. Results are output in multiple formats (text, JSON, SARIF, CSV, JUnit, HTML, SonarQube, golint, YAML). The tool also integrates with AI providers (OpenAI, Claude, Gemini, Atlas) to suggest automated fixes for detected vulnerabilities. Notable design highlights include a generic LRU cache for regex matching, a path-based rule exclusion filter, a comprehensive CWE knowledge base, and a well-abstracted taint analysis configuration system. The codebase demonstrates strong engineering practices with extensive test coverage, performance benchmarks, and CI/CD pipelines for release and scanning.

RATING: 9.2/10 MAINT: active DRIFT: low
▸ 5 reusable components found
Instagram/LibCST ★ 1941 228 APPLICATION

LibCST is a Concrete Syntax Tree (CST) parser, analyzer, and transformation framework for Python 3.9–3.15, developed by Meta (Instagram). Unlike an AST, the CST preserves every byte of the original source—including whitespace, comments, parentheses, and formatting—enabling lossless round-trips and precise automated refactoring. The library provides a rich node hierarchy (expressions, statements, operators, whitespace), a full parser with both a pure-Python fallback and a high-performance Rust native implementation via PyO3, and a visitor/transformer system with typed visit/leave methods. It also includes a reusable metadata system with providers for source positions, scopes, qualified names, expression context, and type inference (via Pyre), as well as a pattern-matching DSL (“matchers”) for declarative node queries and a CLI tool for running codemods. The codemod framework is a major feature: it offers base classes for writing automated code transformations (VisitorBasedCodemodCommand, MagicArgsCodemodCommand), bundled commands for common refactoring tasks (removing unused imports, converting type comments, migrating format strings to f-strings, renaming symbols, adding trailing commas, etc.), and a testing harness (CodemodTest). The library is designed for tooling such as linters, formatters, and large-scale migration scripts—and is used internally at Meta for exactly these purposes. It is distributed as a pip package with pre-built wheels, supports multiple operating systems and Python free-threaded builds, and is actively maintained with a mature CI pipeline. Architecturally, LibCST is a library, not a standalone application, though it exposes a CLI via ‘python -m libcst.tool’. It has no API endpoints, databases, or data pipelines. The codebase is well-structured, heavily tested (93%+ coverage), and includes code generation for typed visitor and matcher classes from node definitions. While the dual parser (Python vs. Rust) introduces some maintenance complexity, the overall craftsmanship is high—clean abstractions, immutable nodes, dependency-injected metadata, and a robust visitor pattern make this a reference implementation for CST processing.

RATING: 9.2/10 MAINT: active DRIFT: low
▸ 3 reusable components found
$ loading more...
$ submit: