1
0
mirror of https://github.com/opencv/opencv.git synced 2026-07-29 23:33:05 +04:00
Commit Graph

36078 Commits

Author SHA1 Message Date
Alexander Smorkalov 9eb887d02d Merge pull request #28751 from asmorkalov:as/read_write_video_alpha
Added alpha channel support to VideoWriter and VideoCapture.
2026-04-03 16:00:08 +03:00
Lurie97 a3e129aad8 Merge pull request #28686 from Lurie97:fix_inplace
core(opencl): fix inplace transpose race by enforcing LLSS ordering via local barrier #28686

The former inplace transpose implementation allowed a reordering of global-memory operations across work-items. Specifically, the intended LLSS (Load–Load–Store–Store) access pattern could be reordered by the GPU into LSLS (Load–Store–Load–Store), causing partially written tiles to be observed by other work-items and producing incorrect output.

This patch introduces a tiled LDS-based algorithm and adds an explicit:

    barrier(CLK_LOCAL_MEM_FENCE);

between the load and store phases.

### Pull Request Readiness Checklist

See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request

- [x] I agree to contribute to the project under Apache 2 License.
- [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
- [ ] The PR is proposed to the proper branch
- [ ] There is a reference to the original bug report and related work
- [ ] There is accuracy test, performance test and test data in opencv_extra repository, if applicable
      Patch to opencv_extra has the same branch name.
- [ ] The feature is well documented and sample code can be built with the project CMake
2026-04-03 15:50:11 +03:00
Alexander Smorkalov 18eb0a1c12 Merge pull request #28754 from vrabaud:intrin
Fix case for intrin.h
2026-04-03 15:24:52 +03:00
LHOOL1109 9dba8a7df0 Merge pull request #28747 from LHOOL1109:fix/python-zero-channel-crash
python: fix segfault on 0-channel numpy array input #28747

### Pull Request Readiness Checklist

- [x] I agree to contribute to the project under Apache 2 License.
- [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
- [x] The PR is proposed to the proper branch
- [x] There is a reference to the original bug report and related work
- [x] There is accuracy test, performance test and test data in opencv_extra repository, if applicable
      N/A: a Python unit test is added in `modules/python/test/test_mat.py`. No external test data required.
- [x] The feature is well documented and sample code can be built with the project CMake
      N/A: this is a bug fix, not a new feature. No documentation update needed.

### Problem

Passing a numpy array with shape `(H, W, 0)` (0 channels) to any OpenCV function that accepts a `Mat` argument (e.g. `cv2.resize`, `cv2.warpAffine`, `cv2.blur`) causes a **segfault**.

**Reproducer:**
```python
import cv2
import numpy as np

arr = np.zeros((100, 100, 0), np.uint8)
cv2.resize(arr, (200, 200))  # segfault
```

### Root Cause

In `modules/python/src2/cv2_convert.cpp`, the numpy→Mat conversion checks channel validity only against `CV_CN_MAX` (upper bound):

```cpp
if (channels > CV_CN_MAX)   // channels=0 passes this check
```

With `channels=0`, `CV_MAKETYPE(0, 0)` produces `type=-8`, which corrupts the Mat's internal type field and causes undefined behavior downstream.

### Fix

Extend the check to also reject `channels < 1`:

```cpp
if (channels < 1 || channels > CV_CN_MAX)
```

**After fix:**
```
cv2.error: src unable to wrap channels, invalid count (0, must be in [1, 512])
```

### Notes

- This affects all functions that accept a `Mat` input, not just `cv2.resize`
- The same bug exists in the `5.x` branch
- A 0-channel array has no valid OpenCV Mat representation; rejecting it with a clear error is the correct behavior and poses no backward-compatibility risk (the previous behavior was a crash)
2026-04-03 14:26:18 +03:00
Alexander Smorkalov 87bdcd4f14 Added alpha channel support to VideoWriter and VideoCapture. 2026-04-03 12:36:45 +03:00
Alexander Smorkalov b90384e13c Merge pull request #28753 from vrabaud:asan
Fix invalid PAM decoding
2026-04-03 10:42:02 +03:00
Vincent Rabaud 6b152941dc Fix case for intrin.h
Compilation fails on platforms that are case-dependent, apparently
some windows arm 64. The source of truth is lower case:
https://github.com/yuikns/intrin/blob/master/intrin.h
2026-04-02 19:01:37 +02:00
Vincent Rabaud 12c90ff05b Fix invalid PAM decoding
This fixes https://issues.oss-fuzz.com/issues/497290557
2026-04-02 16:01:00 +02:00
Ahmad 10e32c96f5 Merge pull request #28535 from AhmadDurrani579:4.x
videoio(gstreamer): fix timestamp drift and color negotiation on Apple #28535

This commit addresses two issues on macOS with Apple M3 hardware:
1. Replaces floating-point timestamp math with gst_util_uint64_scale_int to ensure nanosecond precision.
2. Explicitly forces I420 format in the encoding profile to prevent hardware encoder negotiation failure.

### Pull Request Readiness Checklist

See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request

- [x] I agree to contribute to the project under Apache 2 License.
- [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
- [ ] The PR is proposed to the proper branch
- [ ] There is a reference to the original bug report and related work
- [ ] There is accuracy test, performance test and test data in opencv_extra repository, if applicable
      Patch to opencv_extra has the same branch name.
- [ ] The feature is well documented and sample code can be built with the project CMake
2026-04-02 13:59:01 +03:00
Alexander Smorkalov 2b31e057cf Merge pull request #28701 from cuiweixie:fix/dnn-batchnorm-bias-blob-index
dnn: fix BatchNorm bias blob index in validation
2026-04-02 13:02:27 +03:00
Alexander Smorkalov 98f46715f7 Merge pull request #28742 from asmorkalov:as/webp_win32_arm
Do not use AVX options on Windows ARM in libwebp.
2026-04-02 08:50:27 +03:00
Alexander Smorkalov 443b748b25 Do not use AVX options on Windows ARM in libwebp. 2026-04-01 08:56:00 +03:00
pratham-mcw 3cf98c51c8 Merge pull request #28609 from pratham-mcw:core-rotate-neon-optimization
core: add NEON implementation for rotate function #28609

- This PR adds a NEON intrinsics-based implementation for the rotate function in matrix_transform.cpp for Windows-ARM64.
- The optimized implementation uses  ARM NEON intrinsics to accelerate the internal transpose step used by the rotate function.
- In the x64 architecture, the rotate operation benefits from IPP-based optimized implementations. However, on ARM64, the execution falls back to the scalar implementation, which results in lower performance.
- To achieve performance parity with x64, a NEON-based SIMD implementation has been added for ARM64. 
- After introducing these changes, the rotate function showed noticeable performance improvements on ARM64 platforms.
<img width="1009" height="817" alt="image" src="https://github.com/user-attachments/assets/8bec0041-b19c-4fc8-9103-532746224515" />

 
- [x] I agree to contribute to the project under Apache 2 License.
- [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
- [x] The PR is proposed to the proper branch
2026-03-31 16:52:04 +03:00
Alexander Smorkalov 92c43f80fc Merge pull request #28739 from pratham-mcw:core/fix-MeanStdDeviation-accuracytest
core: fix meanStdDev bug by using separate variables v2, v3 in sumsqr_
2026-03-31 15:39:16 +03:00
Alexander Smorkalov 7e8e0853a8 Merge pull request #28611 from Arths17:4.x
Fix Windows build issues with IPPICV unpack and IPPIW CMakeLists.txt …
2026-03-31 15:24:38 +03:00
Alexander Smorkalov e038cfda95 Merge pull request #28737 from vrabaud:asan
Force step to be ptrdiff_t in resize
2026-03-31 10:33:47 +03:00
Alexander Smorkalov f82522ccfb Merge pull request #28589 from nmizonov:fix_ippiw_binary_usage
Fixed search of IPP IW binaries in cmake
2026-03-31 10:27:41 +03:00
pratham-mcw c5d747f75c core: fix meanStdDev bug by using separate variables v2, v3 in sumsqr_ 2026-03-31 11:29:34 +05:30
Vincent Rabaud 5c91261ca0 Force step to be ptrdiff_t in resize
Otherwise, ASAN could return an error:
"runtime error: addition of unsigned offset"
2026-03-30 10:48:00 +02:00
SamareshSingh 2027a33990 Merge pull request #28724 from ssam18:fix/resize-ngraph-two-inputs-28707
dnn: fix Resize initNgraph for two-input case #28724

## Summary

Fixes the issue #28707

When a Resize/Upsample layer has two inputs, the data tensor and a reference tensor whose **shape** defines the output spatial size, the OpenVINO/NGRAPH backend's `initNgraph()` was ignoring `nodes[1]` entirely and relying solely on the `outHeight`/`outWidth` member variables.

These variables are set by `finalize()` from the pre-computed output blob dimensions. However, when the output shape is determined dynamically at runtime from the second input, `finalize()` sets them from the live tensor, but the OpenVINO backend calls `initNgraph()` to build a static compiled graph. If the member variables are 0 at that point, the compiled `Interpolate` node gets hardcoded with `{0, 0}` output dimensions, causing CV_Assert failure: {N,C,0,0} vs {N,C,H2,W2}
2026-03-30 10:06:54 +03:00
Anshu c7732e1043 Merge pull request #28397 from 0AnshuAditya0:fix-simd-oob-read-28396
Fixes #28396 : out-of-bounds read in SIMD type conversion #28397

Fixes #28396
Fixes #27080

The vx_load_expand function in WASM intrinsics was using 
wasm_v128_load which always loads a full 128-bit register 
(16 bytes), even when the function only needed 8 elements.

For example, when converting uint8 to float32:
- vx_load_expand needs 8 uint8 elements
- But wasm_v128_load reads 16 bytes from memory
- This causes an 8-byte out-of-bounds read

### Pull Request Readiness Checklist

See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request

- [x] I agree to contribute to the project under Apache 2 License.
- [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
- [x] The PR is proposed to the proper branch
- [x] There is a reference to the original bug report and related work
- [ ] There is accuracy test, performance test and test data in opencv_extra repository, if applicable
      Patch to opencv_extra has the same branch name.
- [ ] The feature is well documented and sample code can be built with the project CMake
2026-03-27 15:40:09 +03:00
Alexander Smorkalov 1630450d25 Merge pull request #28727 from asmorkalov:as/calibrate_perf_data
Replace calibration images with saved image points.
2026-03-27 14:59:33 +03:00
Alexander Smorkalov d45b442f4e Replace calibration images with saved image points. 2026-03-27 10:52:21 +03:00
Alexander Smorkalov 689d514885 Merge pull request #28698 from PDGGK:fix/android-utils-resource-leak
Fix resource leaks in Android Utils.java (#28697)
2026-03-26 15:33:04 +03:00
Rohan Mistry 7e5463b34f Merge pull request #28461 from Ron12777:opt-clean
Optimize calibrateCamera with Schur‑complement LM and parallel Jacobian accumulation #28461

## Summary

- Optimized `calibrateCamera` for faster runtime without changing outputs using Schur‑complement LM, Parallel Jacobian accumulation, alongside other optimizations.
- Reduced time complexity from O(n^3) to O(n)
- Add a perf test that uses a 500-image chessboard dataset for performance testing.

## Performance
<img width="1200" height="800" alt="base_vs_fast_results" src="https://github.com/user-attachments/assets/6dafa19f-f9cb-4f7f-ba40-0940373712e8" />
<img width="1200" height="800" alt="fast_vs_ceres_results" src="https://github.com/user-attachments/assets/7157af27-8a2b-4810-8b53-3cc9972a8493" />
<img width="1200" height="800" alt="base_vs_fast_param_deviation" src="https://github.com/user-attachments/assets/fe4f954c-34f9-4b9a-b1b2-46e4c76ce08c" />


[Testing repo
](https://github.com/Ron12777/OpenCV-benchmarking)
## Testing
- All local tests pass 

## Related

- [opencv_extra PR with test images](https://github.com/opencv/opencv_extra/pull/1312)


See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request

- [x] I agree to contribute to the project under Apache 2 License.
- [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
- [x] The PR is proposed to the proper branch
- [ ] There is a reference to the original bug report and related work
- [x] There is accuracy test, performance test and test data in opencv_extra repository, if applicable
      Patch to opencv_extra has the same branch name.
- [x] The feature is well documented and sample code can be built with the project CMake
2026-03-26 12:18:50 +03:00
Alexander Smorkalov 3c7fd7c25a Merge pull request #28723 from akretz:fix-mean-perf
Benchmark cv::mean instead of cvtest::mean
2026-03-26 11:40:37 +03:00
Adrian Kretz a4d9b45168 Benchmark cv::mean instead of cvtest::mean 2026-03-25 21:30:22 +01:00
ffccites 16db340890 Fix resource leaks in Android Utils.java (#28697)
Convert exportResource() and loadResource() to use try-with-resources
to ensure InputStream, FileOutputStream, and ByteArrayOutputStream are
properly closed even when exceptions occur.

Also remove printStackTrace() in exportResource(), as the exception is
already rethrown as CvException with the original exception details.

Signed-off-by: ffccites <99155080+PDGGK@users.noreply.github.com>
2026-03-24 16:41:40 +11:00
Alexander Smorkalov 45c1f9d803 Merge pull request #28652 from mvanhorn:osc/28651-fix-reprojection-error-rmse
calib3d: fix reprojection error RMSE calculation in Python tutorial
2026-03-23 17:08:16 +03:00
ZIHAN DAI 1610602884 Merge pull request #28699 from PDGGK:fix/highgui-system-exit
Replace System.exit(-1) with exceptions in HighGui.java (#28696) #28699

## Summary

Library code should never call System.exit() as it kills the entire JVM. Replaced all 3 instances with appropriate exceptions.

Closes #28696

## Changes

- `imshow()` with empty image: `System.exit(-1)` -> `throw new IllegalArgumentException("Image is empty")`
- `waitKey()` with no windows: `System.exit(-1)` -> `throw new IllegalStateException("No windows created. Call imshow() first")`
- `waitKey()` with null window image: `System.exit(-1)` -> `throw new IllegalStateException("No image set for window: ... Call imshow() first")`
- `InterruptedException` catch: `printStackTrace()` -> `Thread.currentThread().interrupt()`
2026-03-23 16:20:50 +03:00
Weixie Cui 1612fd9ac3 dnn: fix BatchNorm bias blob index in validation
When hasBias is true, CV_Assert must reference blobs[biasBlobIndex], not blobs[weightsBlobIndex], for the bias tensor.
2026-03-22 02:52:52 +08:00
Alexander Smorkalov 4413c953d1 Merge pull request #28684 from abhishek-gola:AVX_VNNI_support_4.x
Added AVX_VNNI function to core module
2026-03-20 12:50:37 +03:00
Abhishek Gola ff2e6358fd added AVXX VNNI support 2026-03-20 13:20:31 +05:30
Alexander Smorkalov f6aceee13b Merge pull request #28655 from usernotfound-101:cvmixchannels-warning-fix
Add static integer casting for cvMixChannels, safer
2026-03-20 10:25:38 +03:00
Alexander Smorkalov 9e5cd6bf9b Merge pull request #28665 from PavelGuzenfeld:fix/stale-typing-stubs-cleanup
Clean up stale typing stubs during incremental builds
2026-03-18 08:13:21 +03:00
Alexander Smorkalov 1c3958384c Merge pull request #28662 from CSBVision:patch-9
Change file globbing to recursive for CUDA DLLs
2026-03-17 18:24:27 +03:00
Pavel Guzenfeld 3779f630bc Clean up stale typing stubs during incremental builds
When a module is disabled in an incremental build (e.g. switching from
-DBUILD_opencv_gapi=ON to OFF), its typing stub directory persists from
the previous build.  The stubs generator only creates directories for
enabled modules but never removes old ones, and the copy step merges
rather than replaces, so stale .pyi files propagate to both the loader
directory and the install prefix.

This causes type-checkers (mypy, pyright) to report errors for stubs
that reference symbols from modules that are no longer available.

Fix both propagation paths:

- generation.py: remove all subdirectories under the stubs output root
  before regenerating, so only currently enabled module stubs exist in
  the build directory.  Top-level files (py.typed) are preserved.

- copy_typings_stubs_on_success.py: remove stale .pyi files and
  py.typed markers from the loader directory before copying fresh stubs,
  so leftover stubs from a previous copy are cleaned up.  Runtime .py
  files are not affected.
2026-03-16 23:41:37 +02:00
pratham-mcw 2dd3d1371a Merge pull request #28636 from pratham-mcw:imgproc_distance_transform_opt
imgproc: add SIMD support for distance transform function #28636

- This PR adds OpenCV SIMD intrinsics-based optimizations to the distance transform functions for improved performance.
- The optimized implementation uses vectorized operations to accelerate the forward and backward passes of distance computation.
- In x64 architecture, distance transform function benefit from IPP-based optimized implementations. However, on ARM64 platforms, the execution falls back to scalar implementation, which results in lower performance.
- After introducing these changes, the distance transform functions showed noticeable performance improvements on Windows-ARM64.
<img width="800" height="706" alt="image" src="https://github.com/user-attachments/assets/9786606a-9d92-489d-a5ea-d2e57453ef02" />

- [x] I agree to contribute to the project under Apache 2 License.
- [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
- [x] The PR is proposed to the proper branch
2026-03-16 13:51:03 +03:00
CSBVision faf36aa95b Change file globbing to recursive for CUDA DLLs
With recent releases, the CUDA installation layout changes introduces a `bin\x64` subdirectory. Recursive glob inside `bin` works in either case.
2026-03-16 11:28:56 +01:00
Alexander Smorkalov 2c839967ff Merge pull request #28660 from PavelGuzenfeld:fix/gapi-optional-module-handling
Fix Python bindings when optional modules are disabled
2026-03-16 11:06:57 +03:00
Pavel Guzenfeld 95ab7149fe Fix Python bindings when optional modules like gapi are disabled
Fix two issues that cause `import cv2` to fail when building with
-DBUILD_opencv_gapi=OFF:

1. In `has_all_required_modules()`, the function parameter `type_node`
   was ignored in favor of the enclosing scope's loop variable `node`.
   This works by accident when called as `has_all_required_modules(node)`
   but is incorrect — the parameter should be used directly.

2. In `__load_extra_py_code_for_module()`, only `ImportError` was
   caught. When a stale gapi submodule directory exists from a previous
   build, gapi/__init__.py raises `AttributeError` (not `ImportError`)
   because it tries to access C++ bindings that don't exist. Now catches
   both exception types for defense-in-depth.

Refs: #26098
2026-03-15 23:21:42 +02:00
Matt Van Horn 5e4592440e calib3d: fix reprojection error RMSE calculation in Python tutorial
The tutorial code used cv.NORM_L2 (which takes a square root) and then
averaged those values. The correct RMSE formula should use NORM_L2SQR
to get squared errors, average them, and take the square root at the
end. Updated the explanatory text to match.

Fixes https://github.com/opencv/opencv/issues/28651
2026-03-13 10:00:23 -07:00
usernotfound-101 3470f5b35b Add static integer casting to get rid of the warning, safer 2026-03-13 22:25:08 +05:30
Madan mohan Manokar 00833f98d0 Merge pull request #28632 from amd:fast_scharr_deriv
video: Optimized ScharrDeriv#28632

- Move to CV_SIMD_SCALABLE
- avx2 & avx512 dispatch added for ScharrDeriv

### Pull Request Readiness Checklist

See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request

- [x] I agree to contribute to the project under Apache 2 License.
- [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
- [x] The PR is proposed to the proper branch
- [ ] There is a reference to the original bug report and related work
- [x] There is accuracy test, performance test and test data in opencv_extra repository, if applicable
      Patch to opencv_extra has the same branch name.
- [x] The feature is well documented and sample code can be built with the project CMake
2026-03-13 13:04:46 +03:00
Alexander Smorkalov 8f9c7c0f72 Merge pull request #28643 from Prasadayus:fix-gather-cast-axis-4x
DNN/ONNX: Preserve axis attribute in GatherCastSubgraph fusion
2026-03-13 11:46:19 +03:00
Madan mohan Manokar 18c7c9bcb9 Merge pull request #28614 from amd:fast_flipHoriz
Optimized flip Horizontal #28614

- Refactor flipHoriz implementation.
- Optimizations for horizontal image flipping added.

### Pull Request Readiness Checklist

See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request

- [x] I agree to contribute to the project under Apache 2 License.
- [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
- [x] The PR is proposed to the proper branch
- [ ] There is a reference to the original bug report and related work
- [x] There is accuracy test, performance test and test data in opencv_extra repository, if applicable
      Patch to opencv_extra has the same branch name.
- [x] The feature is well documented and sample code can be built with the project CMake
2026-03-13 11:11:20 +03:00
rajmahadev422 84300d5025 Merge pull request #28618 from rajmahadev422:vscode_opencv
### Pull Request Readiness Checklist

See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request

- [x] I agree to contribute to the project under Apache 2 License.
- [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
- [x] The PR is proposed to the proper branch
- [ ] There is a reference to the original bug report and related work
- [ ] There is accuracy test, performance test and test data in opencv_extra repository, if applicable
      Patch to opencv_extra has the same branch name.
- [ ] The feature is well documented and sample code can be built with the project CMake

## This tutorial describe how to build opencv from source in windows using VSCode and MSYS2
2026-03-13 10:38:39 +03:00
Alexander Smorkalov a1a0cc2891 Merge pull request #28644 from s-trinh:fix_calibration_exe_ignore_orientation
Ignore exif orientation and add option for the calibration exe
2026-03-12 10:53:13 +03:00
Matt Van Horn 8e1fa1bbdc Merge pull request #28620 from mvanhorn:osc/28619-fix-yaml-parsekey-empty-key-oob
core: fix heap-buffer-overflow in YAML parseKey for empty keys #28620

### Pull Request Readiness Checklist

See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request

- [x] I agree to contribute to the project under Apache 2 License.
- [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
- [x] The PR is proposed to the proper branch
- [x] There is a reference to the original bug report and related work
- [ ] There is accuracy test, performance test and test data in opencv_extra repository, if applicable
      Patch to opencv_extra has the same branch name.
- [ ] The feature is well documented and sample code can be built with the project CMake

### Description

Fixes https://github.com/opencv/opencv/issues/28619

Moves the "empty key" check before the backward do-while scan in `YAMLParser::parseKey()`.

**Problem:** When parsing a YAML mapping with an empty key (e.g. `: 10` at column 0), `endptr == ptr` after the forward scan finds `:`. The do-while loop `do c = *--endptr; while(c == ' ')` always executes at least once, so it decrements `endptr` to `ptr-1` and reads one byte before the heap allocation (ASan: heap-buffer-overflow READ of size 1).

**Fix:** Check `endptr == ptr` before entering the backward loop. If the key is empty, raise `CV_PARSE_ERROR_CPP("An empty key")` immediately without the OOB read.

This contribution was developed with AI assistance (Claude Code).
2026-03-12 10:37:24 +03:00
Alexander Smorkalov 1a3e1e05b7 Merge pull request #28581 from JoyBoy900908:fix-ubsan-countnonzero
core: fix UBSan function pointer type mismatch in countNonZero
2026-03-12 10:16:17 +03:00