Skip to content

Commit 96acd11

Browse files
authored
Merge branch 'main' into pca-c-api
2 parents e828244 + c95625b commit 96acd11

95 files changed

Lines changed: 5659 additions & 931 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.coderabbit.yaml

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
reviews:
5+
profile: chill
6+
high_level_summary: true
7+
high_level_summary_in_walkthrough: true
8+
poem: false
9+
auto_review:
10+
enabled: true
11+
drafts: false
12+
base_branches:
13+
- "^main$"
14+
- "^release/.*"
15+
- "^hotfix/.*"
16+
ignore_usernames: ["rapids-bot", "GPUtester", "nv-automation-bot", "copy-pr-bot"]
17+
tools:
18+
markdownlint:
19+
enabled: true
20+
shellcheck:
21+
enabled: true
22+
gitleaks:
23+
enabled: true
24+
sequence_diagrams: false
25+
collapse_walkthrough: true
26+
27+
# Reduce noise from status messages
28+
request_changes_workflow: false
29+
review_status: false
30+
31+
# Path-specific review instructions
32+
# Note: Detailed C++/CUDA and Python review guidelines are in cpp/REVIEW_GUIDELINES.md and python/REVIEW_GUIDELINES.md
33+
path_instructions:
34+
- path: "docs/**/*"
35+
instructions: |
36+
For documentation changes, focus on:
37+
- Accuracy: Verify code examples compile and run correctly
38+
- Completeness: Check if API changes (parameters, return values, errors) are documented
39+
- Clarity: Flag confusing explanations, missing prerequisites, or unclear examples
40+
- Consistency: Version numbers, parameter types, and terminology match code
41+
- Missing docs: If PR changes public APIs without updating docs, flag as HIGH priority
42+
43+
- path: "c/include/cuvs/**/*"
44+
instructions: |
45+
For public C API headers, additionally check:
46+
- Doxygen documentation for all public functions/classes
47+
- API changes flagged for docs/ updates
48+
- Breaking changes require deprecation warnings and migration guide updates
49+
50+
- path: "cpp/include/cuvs/**/*"
51+
instructions: |
52+
For public C++ API headers, additionally check:
53+
- Doxygen documentation for all public functions/classes
54+
- API changes flagged for docs/ updates
55+
- Breaking changes require deprecation warnings and migration guide updates
56+
57+
- path: "notebooks/**/*"
58+
instructions: |
59+
For example notebooks:
60+
- Verify code examples match current API (parameter names, return types)
61+
- Flag outdated imports or deprecated API usage
62+
63+
- path: "ci/**/*"
64+
instructions: |
65+
For CI/build scripts:
66+
- Check for proper conda environment handling
67+
- Verify GPU availability checks before tests
68+
- Check for proper error handling and meaningful error messages
69+
70+
knowledge_base:
71+
opt_out: false
72+
code_guidelines:
73+
filePatterns:
74+
- "cpp/REVIEW_GUIDELINES.md"
75+
- "python/REVIEW_GUIDELINES.md"
76+
- "docs/source/contributing.md"
77+
- "docs/source/developer_guide.md"

.github/CODEOWNERS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ cpp/scripts/run-cmake-format.sh @rapidsai/cuvs-cmake-codeowners
3131
/.github/ @rapidsai/ci-codeowners
3232
/ci/ @rapidsai/ci-codeowners
3333
/.shellcheckrc @rapidsai/ci-codeowners
34+
/.coderabbit.yaml @rapidsai/ci-codeowners
3435

3536
#packaging code owners
3637
/.pre-commit-config.yaml @rapidsai/packaging-codeowners

.github/workflows/pr.yaml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ jobs:
6868
files_yaml: |
6969
build_docs:
7070
- '**'
71+
- '!**/*/REVIEW_GUIDELINES.md'
72+
- '!.coderabbit.yaml'
7173
- '!.devcontainer/**'
7274
- '!.github/CODEOWNERS'
7375
- '!.github/ISSUE_TEMPLATE/**'
@@ -90,6 +92,8 @@ jobs:
9092
- '!thirdparty/LICENSES/**'
9193
test_cpp:
9294
- '**'
95+
- '!**/*/REVIEW_GUIDELINES.md'
96+
- '!.coderabbit.yaml'
9397
- '!.devcontainer/**'
9498
- '!.github/CODEOWNERS'
9599
- '!.github/ISSUE_TEMPLATE/**'
@@ -124,6 +128,8 @@ jobs:
124128
- '!thirdparty/LICENSES/**'
125129
test_java:
126130
- '**'
131+
- '!**/*/REVIEW_GUIDELINES.md'
132+
- '!.coderabbit.yaml'
127133
- '!.devcontainer/**'
128134
- '!.github/CODEOWNERS'
129135
- '!.github/ISSUE_TEMPLATE/**'
@@ -157,6 +163,8 @@ jobs:
157163
- '!thirdparty/LICENSES/**'
158164
test_python_conda:
159165
- '**'
166+
- '!**/*/REVIEW_GUIDELINES.md'
167+
- '!.coderabbit.yaml'
160168
- '!.devcontainer/**'
161169
- '!.github/CODEOWNERS'
162170
- '!.github/ISSUE_TEMPLATE/**'
@@ -194,6 +202,8 @@ jobs:
194202
- '!thirdparty/LICENSES/**'
195203
test_python_wheels:
196204
- '**'
205+
- '!**/*/REVIEW_GUIDELINES.md'
206+
- '!.coderabbit.yaml'
197207
- '!.devcontainer/**'
198208
- '!.github/CODEOWNERS'
199209
- '!.github/ISSUE_TEMPLATE/**'
@@ -236,6 +246,8 @@ jobs:
236246
- '!thirdparty/LICENSES/**'
237247
test_rust:
238248
- '**'
249+
- '!**/*/REVIEW_GUIDELINES.md'
250+
- '!.coderabbit.yaml'
239251
- '!.devcontainer/**'
240252
- '!.github/CODEOWNERS'
241253
- '!.github/ISSUE_TEMPLATE/**'
@@ -273,6 +285,8 @@ jobs:
273285
- '!thirdparty/LICENSES/**'
274286
test_go:
275287
- '**'
288+
- '!**/*/REVIEW_GUIDELINES.md'
289+
- '!.coderabbit.yaml'
276290
- '!.devcontainer/**'
277291
- '!.github/CODEOWNERS'
278292
- '!.github/ISSUE_TEMPLATE/**'

.pre-commit-config.yaml

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ repos:
4343
additional_dependencies: [toml]
4444
args: ["--config=pyproject.toml"]
4545
- repo: https://github.com/pre-commit/mirrors-clang-format
46-
rev: v20.1.4
46+
rev: v20.1.8
4747
hooks:
4848
- id: clang-format
4949
types_or: [c, c++, cuda]
@@ -96,10 +96,14 @@ repos:
9696
name: clang-format-with-cmake-placeholders
9797
entry: python3 ci/checks/clang_format_with_cmake_placeholders.py
9898
language: python
99-
additional_dependencies: [clang_format==20.1.4]
99+
additional_dependencies: [clang_format==20.1.8]
100100
files: |
101101
(?x)
102102
[.](cpp|cu|hpp|cuh)[.]in$
103+
# clang-format struggles with one of the placeholders in register_fatbin.cpp.in, so exclude it
104+
exclude: |
105+
(?x)
106+
^cpp/cmake/modules/register_fatbin[.]cpp[.]in$
103107
- repo: https://github.com/codespell-project/codespell
104108
rev: v2.4.1
105109
hooks:

CHANGELOG.md

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,109 @@
1+
# cuvs 26.04.00 (8 Apr 2026)
2+
3+
### 🚨 Breaking Changes
4+
* Use HNSW GPU Hierarchy by Default by @julianmi in https://github.com/rapidsai/cuvs/pull/1617
5+
* Backport "Default to static linking of libcudart" by @KyleFromNVIDIA in https://github.com/rapidsai/cuvs/pull/1918
6+
* enforce a floor on libnvjitlink, build wheels with CUDA 13.0.x, test wheels against mix of CTK versions by @jameslamb in https://github.com/rapidsai/cuvs/pull/1862
7+
### 🐛 Bug Fixes
8+
* Add float16 support for CAGRA extend by @lowener in https://github.com/rapidsai/cuvs/pull/1620
9+
* Fix C examples CUDAToolkit dependency by @tfeher in https://github.com/rapidsai/cuvs/pull/1626
10+
* clang-tidy: remove AnalyzeTemporaryDtors key by @achirkin in https://github.com/rapidsai/cuvs/pull/1778
11+
* Fix build.sh: build cuvs_c for examples and fix --gpu-arch parsing by @achirkin in https://github.com/rapidsai/cuvs/pull/1779
12+
* Better handling of batching of search in MG replicated mode by @viclafargue in https://github.com/rapidsai/cuvs/pull/1718
13+
* Add nvjitlink to cuda-toolkit pip extras for cusparse compatibility by @bdice in https://github.com/rapidsai/cuvs/pull/1794
14+
* [REVIEW] Fix: for balanced kmeans use grid.x for adjust_centers to avoid grid.y overflow for >262K centroids by @Nischal1729 in https://github.com/rapidsai/cuvs/pull/1805
15+
* Fix thrust header by @aamijar in https://github.com/rapidsai/cuvs/pull/1817
16+
* Fix persistent CAGRA regressions by @achirkin in https://github.com/rapidsai/cuvs/pull/1800
17+
* Fix thrust header by @aamijar in https://github.com/rapidsai/cuvs/pull/1825
18+
* Set `cudaFuncAttributeMaxDynamicSharedMemorySize` with thread-safety by @mythrocks in https://github.com/rapidsai/cuvs/pull/1771
19+
* [REVIEW] Move from `thrust::make_counting_iterator` to `cuda::make_counting_iterator` by @mythrocks in https://github.com/rapidsai/cuvs/pull/1826
20+
* Fixed cuvs benchmark debug build issue (linker step fail) by @irina-resh-nvda in https://github.com/rapidsai/cuvs/pull/1599
21+
* Graph degree equals intermediate graph degree bug fix by @irina-resh-nvda in https://github.com/rapidsai/cuvs/pull/1834
22+
* FAISS patch for `thrust_counting_iterator.h` by @aamijar in https://github.com/rapidsai/cuvs/pull/1844
23+
* Use 1D grid calculations in `epsilon_neighborhood` by @divyegala in https://github.com/rapidsai/cuvs/pull/1847
24+
* Fix setting CAGRA graph build algo to iterative search by default by @achirkin in https://github.com/rapidsai/cuvs/pull/1864
25+
* Faiss suppress warning 611 by @aamijar in https://github.com/rapidsai/cuvs/pull/1879
26+
* Pin faiss to 1.14.0 by @aamijar in https://github.com/rapidsai/cuvs/pull/1885
27+
* Make some minor fixes to JIT+LTO functionality by @KyleFromNVIDIA in https://github.com/rapidsai/cuvs/pull/1896
28+
* Revert "Default to static linking of libcudart" by @KyleFromNVIDIA in https://github.com/rapidsai/cuvs/pull/1925
29+
* Fix hanging pytests by @aamijar in https://github.com/rapidsai/cuvs/pull/1924
30+
* Disallow programmatic stream serialization in JIT kernel launches by @divyegala in https://github.com/rapidsai/cuvs/pull/1932
31+
* IVF-Flat: fix irrelevant assert in the fused kernel mode by @achirkin in https://github.com/rapidsai/cuvs/pull/1941
32+
* [REVIEW] cuVS bench: Fix cudaFuncSetAttribute not being called when CAGRA search switches kernel variants by @irina-resh-nvda in https://github.com/rapidsai/cuvs/pull/1851
33+
* Pin openblas for aarch64 by @tarang-jain in https://github.com/rapidsai/cuvs/pull/1965
34+
* Null JIT kernel launch config by @divyegala in https://github.com/rapidsai/cuvs/pull/1974
35+
* [BUG] Fix Vamana Serialization by @tarang-jain in https://github.com/rapidsai/cuvs/pull/1966
36+
### 📖 Documentation
37+
* remove docs references to cuvs-bench-datasets, install a C compiler in pre-commit env by @jameslamb in https://github.com/rapidsai/cuvs/pull/1736
38+
* Adding simple tarball install to build and install docs by @cjnolet in https://github.com/rapidsai/cuvs/pull/1868
39+
* Fixing nccl link in tarball install instructions by @cjnolet in https://github.com/rapidsai/cuvs/pull/1887
40+
* Add developer and user guides for JIT by @divyegala in https://github.com/rapidsai/cuvs/pull/1876
41+
* PCA docs by @aamijar in https://github.com/rapidsai/cuvs/pull/1949
42+
* Fix a few typos and ``.rst`` link syntax by @jrbourbeau in https://github.com/rapidsai/cuvs/pull/1973
43+
* Update docs footer year by @aamijar in https://github.com/rapidsai/cuvs/pull/1958
44+
* Doc improvements by @aamijar in https://github.com/rapidsai/cuvs/pull/1978
45+
### 🚀 New Features
46+
* JIT compile `interleaved_scan_kernel` for CUDA 13 by @divyegala in https://github.com/rapidsai/cuvs/pull/1405
47+
* [REVIEW] L1 distance support for iterative search CAGRA build by @yan-zaretskiy in https://github.com/rapidsai/cuvs/pull/1831
48+
* [FEA] Inertia Computation for Balanced KMeans and Add Option for Weighted Inertia by @tarang-jain in https://github.com/rapidsai/cuvs/pull/1880
49+
* PCA preprocessor by @aamijar in https://github.com/rapidsai/cuvs/pull/1808
50+
* [FEA] Add Batching to KMeans by @tarang-jain in https://github.com/rapidsai/cuvs/pull/1886
51+
### 🛠️ Improvements
52+
* Automatic Partition Count Derivation for ACE by @julianmi in https://github.com/rapidsai/cuvs/pull/1603
53+
* Add filter for cagra::merge by @benfred in https://github.com/rapidsai/cuvs/pull/1496
54+
* Ivf_flat extends golang APIs by @cpegeric in https://github.com/rapidsai/cuvs/pull/1600
55+
* Drop Python 3.10 support by @gforsyth in https://github.com/rapidsai/cuvs/pull/1748
56+
* tighten wheel size limits, expand CI-skipping logic, other small build changes by @jameslamb in https://github.com/rapidsai/cuvs/pull/1751
57+
* Migrate hash strategy to use the new cuco::static_map by @PointKernel in https://github.com/rapidsai/cuvs/pull/1462
58+
* Update raft headers by @aamijar in https://github.com/rapidsai/cuvs/pull/1763
59+
* remove pip.conf migration code in CI scripts, update CI-skipping rules by @jameslamb in https://github.com/rapidsai/cuvs/pull/1760
60+
* Convert non-type template parameters to runtime parameters in CAGRA search to cut binary size by @seunghwak in https://github.com/rapidsai/cuvs/pull/1498
61+
* Rename lanczos by @aamijar in https://github.com/rapidsai/cuvs/pull/1759
62+
* CI: build with CUDA 13.1.1 by @jameslamb in https://github.com/rapidsai/cuvs/pull/1766
63+
* Fixes for stricter compilers by @maxwbuckley in https://github.com/rapidsai/cuvs/pull/1703
64+
* fix cpu_search call by including `k` argument by @benfred in https://github.com/rapidsai/cuvs/pull/1785
65+
* Use GHA id-token for `sccache-dist` auth token by @trxcllnt in https://github.com/rapidsai/cuvs/pull/1790
66+
* Remove `cagra_optimize.hpp` by @aamijar in https://github.com/rapidsai/cuvs/pull/1791
67+
* Remove unused use_norms constant from kernel_sm60.cuh by @maxwbuckley in https://github.com/rapidsai/cuvs/pull/1705
68+
* Remove unused variable read_idx from query loop by @maxwbuckley in https://github.com/rapidsai/cuvs/pull/1706
69+
* remove gitutils by @jameslamb in https://github.com/rapidsai/cuvs/pull/1797
70+
* refactor: build wheels and conda packages using Python limited API by @gforsyth in https://github.com/rapidsai/cuvs/pull/1788
71+
* Add pluggable backend architecture to cuvs-bench by @jnke2016 in https://github.com/rapidsai/cuvs/pull/1536
72+
* Use Specific CCCL Includes by @divyegala in https://github.com/rapidsai/cuvs/pull/1806
73+
* Replace `thrust::tuple` with `cuda::std::tuple` by @miscco in https://github.com/rapidsai/cuvs/pull/1811
74+
* check-nightly-ci: update to new version by @jameslamb in https://github.com/rapidsai/cuvs/pull/1813
75+
* check-nightly-ci: remove testing config by @jameslamb in https://github.com/rapidsai/cuvs/pull/1824
76+
* Refactor JIT LTO kernel generation by @KyleFromNVIDIA in https://github.com/rapidsai/cuvs/pull/1812
77+
* Move `test_compute_matrix_product.py` to `cpp/tests` by @KyleFromNVIDIA in https://github.com/rapidsai/cuvs/pull/1836
78+
* Drop uses of `thrust/functional.h` by @miscco in https://github.com/rapidsai/cuvs/pull/1835
79+
* Better `ncv` param spectral embedding edge case by @aamijar in https://github.com/rapidsai/cuvs/pull/1828
80+
* Modernize the uses of raft in cuVS by @achirkin in https://github.com/rapidsai/cuvs/pull/1837
81+
* refactor(limited api): add explicit `wheel.py-api` to `pyproject.toml`
82+
by @gforsyth in https://github.com/rapidsai/cuvs/pull/1852
83+
* Update Cython lower bound pin to 3.2.2 by @vyasr in https://github.com/rapidsai/cuvs/pull/1858
84+
* Add support for Python 3.14 by @gforsyth in https://github.com/rapidsai/cuvs/pull/1845
85+
* fix(rust): change Index::search to take &self instead of self by @zbennett10 in https://github.com/rapidsai/cuvs/pull/1839
86+
* Remove pytest upper bound pin by @vyasr in https://github.com/rapidsai/cuvs/pull/1867
87+
* Readme: vecflow paper in references by @aamijar in https://github.com/rapidsai/cuvs/pull/1874
88+
* Refactor knn graph build params to remove `graph_build_types.hpp` by @jinsolp in https://github.com/rapidsai/cuvs/pull/1235
89+
* Remove IndexWrapper by @aamijar in https://github.com/rapidsai/cuvs/pull/1792
90+
* Use C linkage for JIT LTO kernels by @divyegala in https://github.com/rapidsai/cuvs/pull/1909
91+
* Prevent nested parallelism in HNSW bench by @julianmi in https://github.com/rapidsai/cuvs/pull/1895
92+
* Add a script to check for breaking C ABI changes by @benfred in https://github.com/rapidsai/cuvs/pull/1749
93+
* Improve the IVF-PQ Coarse Batch Size Workspace Estimation by @julianmi in https://github.com/rapidsai/cuvs/pull/1937
94+
* ScaNN: Fix AVQ prefetch by @rmaschal in https://github.com/rapidsai/cuvs/pull/1899
95+
96+
## New Contributors
97+
* @cpegeric made their first contribution in https://github.com/rapidsai/cuvs/pull/1600
98+
* @PointKernel made their first contribution in https://github.com/rapidsai/cuvs/pull/1462
99+
* @seunghwak made their first contribution in https://github.com/rapidsai/cuvs/pull/1498
100+
* @Nischal1729 made their first contribution in https://github.com/rapidsai/cuvs/pull/1805
101+
* @jnke2016 made their first contribution in https://github.com/rapidsai/cuvs/pull/1536
102+
* @zbennett10 made their first contribution in https://github.com/rapidsai/cuvs/pull/1839
103+
* @jrbourbeau made their first contribution in https://github.com/rapidsai/cuvs/pull/1973
104+
105+
**Full Changelog**: https://github.com/rapidsai/cuvs/compare/v26.04.00a...release/26.04
106+
1107
# cuvs 26.02.00 (4 Feb 2026)
2108

3109
### 🚨 Breaking Changes

ci/validate_wheel.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@ PYDISTCHECK_ARGS=(
2121
if [[ "${package_dir}" == "python/libcuvs" ]]; then
2222
if [[ "${RAPIDS_CUDA_MAJOR}" == "12" ]]; then
2323
PYDISTCHECK_ARGS+=(
24-
--max-allowed-size-compressed '800Mi'
24+
--max-allowed-size-compressed '400Mi'
2525
)
2626
else
2727
PYDISTCHECK_ARGS+=(
28-
--max-allowed-size-compressed '450Mi'
28+
--max-allowed-size-compressed '250Mi'
2929
)
3030
fi
3131
elif [[ "${package_dir}" != "python/cuvs" ]]; then

conda/environments/all_cuda-129_arch-aarch64.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ dependencies:
88
- _go_select *=cgo
99
- breathe>=4.35.0
1010
- c-compiler
11-
- clang-tools==20.1.4
12-
- clang==20.1.4
11+
- clang-tools==20.1.8
12+
- clang==20.1.8
1313
- cmake>=3.30.4
1414
- cuda-nvcc
1515
- cuda-nvtx-dev
@@ -25,7 +25,7 @@ dependencies:
2525
- go
2626
- graphviz
2727
- ipython
28-
- libclang==20.1.4
28+
- libclang==20.1.8
2929
- libcublas-dev
3030
- libcurand-dev
3131
- libcusolver-dev

conda/environments/all_cuda-129_arch-x86_64.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ dependencies:
88
- _go_select *=cgo
99
- breathe>=4.35.0
1010
- c-compiler
11-
- clang-tools==20.1.4
12-
- clang==20.1.4
11+
- clang-tools==20.1.8
12+
- clang==20.1.8
1313
- cmake>=3.30.4
1414
- cuda-nvcc
1515
- cuda-nvtx-dev
@@ -25,7 +25,7 @@ dependencies:
2525
- go
2626
- graphviz
2727
- ipython
28-
- libclang==20.1.4
28+
- libclang==20.1.8
2929
- libcublas-dev
3030
- libcurand-dev
3131
- libcusolver-dev

conda/environments/all_cuda-131_arch-aarch64.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ dependencies:
88
- _go_select *=cgo
99
- breathe>=4.35.0
1010
- c-compiler
11-
- clang-tools==20.1.4
12-
- clang==20.1.4
11+
- clang-tools==20.1.8
12+
- clang==20.1.8
1313
- cmake>=3.30.4
1414
- cuda-nvcc
1515
- cuda-nvtx-dev
@@ -25,7 +25,7 @@ dependencies:
2525
- go
2626
- graphviz
2727
- ipython
28-
- libclang==20.1.4
28+
- libclang==20.1.8
2929
- libcublas-dev
3030
- libcurand-dev
3131
- libcusolver-dev

conda/environments/all_cuda-131_arch-x86_64.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ dependencies:
88
- _go_select *=cgo
99
- breathe>=4.35.0
1010
- c-compiler
11-
- clang-tools==20.1.4
12-
- clang==20.1.4
11+
- clang-tools==20.1.8
12+
- clang==20.1.8
1313
- cmake>=3.30.4
1414
- cuda-nvcc
1515
- cuda-nvtx-dev
@@ -25,7 +25,7 @@ dependencies:
2525
- go
2626
- graphviz
2727
- ipython
28-
- libclang==20.1.4
28+
- libclang==20.1.8
2929
- libcublas-dev
3030
- libcurand-dev
3131
- libcusolver-dev

0 commit comments

Comments
 (0)