nareshmlx/opencv-pr huggingface dataset:
**File:** modules/objdetect/src/qrcode_encoder.cpp
**Change Type:** added
**Context:** PR #17889: QR code (encoding process) - **Merge with extra**: https://github.com/opencv/opencv_extra/pull/807 [ISO standard](https://github.com/yansik...

**Code Changes:**
```diff
@@ -0,0 +1,1265 @@
+// This file is part of OpenCV project.
+// It is subject to the license terms in the LICENSE file found in the top-level directory
+// of this distribution and at http://opencv.org/license.html.
+//
+// Copyright (C) 2021, Intel Corporation, all rights reserved.
+
+#include "precomp.hpp"
+#include "qrcode_encoder_table.inl.hpp"
+namespace cv
```

Review comment:
`cur_string.length()` should be equal to `i`.
**File:** modules/objdetect/src/qrcode_encoder.cpp
**Change Type:** added
**Context:** PR #17889: QR code (encoding process) - **Merge with extra**: https://github.com/opencv/opencv_extra/pull/807 [ISO standard](https://github.com/yansik...
**Review Line:** 176

**Code Changes:**
```diff
+        version_size = 21;
+        mask_type = 0;
+        parity = 0;
+        sequence_num = 0;
+        total_num = 0;
+    }
+
+    void encode(const String& encoded_info, OutputArray qrcode) CV_OVERRIDE;
+    void encodeStructuredAppend(const String& input, OutputArrayOfArrays output) CV_OVERRIDE;
+    QRCodeEncoder::Params params;
+protected:
```

Review comment:
not all variables are initialized in ctor: ``` int version_size; int mask_type; uint32_t eci_assignment_number; uint8_t parity; uint8_t sequence_num; uint8_t total_num; ```
**File:** modules/objdetect/include/opencv2/objdetect.hpp
**Change Type:** modified
**Context:** PR #17889: QR code (encoding process) - **Merge with extra**: https://github.com/opencv/opencv_extra/pull/807 [ISO standard](https://github.com/yansik...

**Code Changes:**
```diff
@@ -670,6 +670,69 @@ struct CV_EXPORTS_W HOGDescriptor
     void groupRectangles(std::vector<cv::Rect>& rectList, std::vector<double>& weights, int groupThreshold, double eps) const;
 };
 
+class CV_EXPORTS_W QRCodeEncoder {
+protected:
+    QRCodeEncoder();  // use ::create()
+public:
+    virtual ~QRCodeEncoder();
+
```

Review comment:
`const String&` should be used for input parameters. here and below
**File:** doc/tutorials/dnn/dnn_face/dnn_face.markdown
**Change Type:** modified
**Context:** PR #20935: Fix problems in tutorial and python sample of dnn_face.
**Review Line:** 62

**Code Changes:**
```diff
 
 ```cpp
-// Initialize FaceRecognizer with model path (cv::String)
-Ptr<FaceRecognizer> faceRecognizer = FaceRecognizer::create(model_path, "");
+// Initialize FaceRecognizerSF with model path (cv::String)
+Ptr<FaceRecognizerSF> faceRecognizer = FaceRecognizerSF::create(model_path, "");
 
 // Aligning and cropping facial image through the first face of faces detected by dnn_face::DNNFaceDetector
 Mat aligned_face;
```

Review comment:
This content should be moved to .cpp files (to be checked through compiler run).
**File:** modules/calib3d/test/test_cameracalibration.cpp
**Change Type:** modified
**Context:** PR #20636: Recover pose from different cameras (version 2)
**Review Line:** 2170

**Code Changes:**
```diff
     int Inliers = 0;
 
@@ -2158,14 +2168,26 @@ TEST(CV_RecoverPoseTest, regression_15341)
 
             // Estimation of fundamental matrix using the RANSAC algorithm
             Mat E, E2, R, t;
+
+            // Check pose when camera matrices are different.
+            for (const auto &distCoeffs: distCoeffsList)
+            {
+                E = findEssentialMat(points1, points2, cameraMatrix, distCoeffs, cameraMatrix2, distCoeffs, RANSAC, 0.999, 1.0, mask);
```

Review comment:
I'm checking the different camera case first as the same camera case modifies the points input.
**File:** modules/calib3d/test/test_cameracalibration.cpp
**Change Type:** modified
**Context:** PR #20636: Recover pose from different cameras (version 2)

**Code Changes:**
```diff
@@ -2142,7 +2142,17 @@ TEST(CV_RecoverPoseTest, regression_15341)
 
     // camera matrix with both focal lengths = 1, and principal point = (0, 0)
     const Mat cameraMatrix = Mat::eye(3, 3, CV_64F);
-    const Mat zeroDistCoeffs = Mat::zeros(1, 5, CV_64F);
+
+    // camera matrix with focal lengths 0.5 and 0.6 respectively and principal point = (100, 200)
+    double cameraMatrix2Data[] = { 0.5, 0, 100,
+                                   0, 0.6, 200,
+                                   0, 0, 1 };
```

Review comment:
Camera matrix has another data layout. Check [documentation](https://docs.opencv.org/3.4/d9/d0c/group__calib3d.html) (camera intrinsic matrix A).
**File:** modules/calib3d/include/opencv2/calib3d.hpp
**Change Type:** modified
**Context:** PR #20636: Recover pose from different cameras (version 2)

**Code Changes:**
```diff
@@ -2842,6 +2842,76 @@ unit length.
  */
 CV_EXPORTS_W void decomposeEssentialMat( InputArray E, OutputArray R1, OutputArray R2, OutputArray t );
 
+/** @brief Recovers the relative camera rotation and the translation from corresponding points in two images from two different cameras, using cheirality check. Returns the number of
+inliers that pass the check.
+
+@param points1 Array of N 2D points from the first image. The point coordinates should be
+floating-point (single or double precision).
+@param points2 Array of the second image points of the same size and format as points1 .
```

Review comment:
> E The input essential matrix. > OutputArray E input? Please don't copy-paste!
**File:** modules/calib3d/src/five-point.cpp
**Change Type:** modified
**Context:** PR #20636: Recover pose from different cameras (version 2)

**Code Changes:**
```diff
@@ -401,6 +401,29 @@ class EMEstimatorCallback CV_FINAL : public PointSetRegistrator::Callback
     }
 };
 
+// Find essential matrix given undistorted points and two cameras.
+static Mat findEssentialMat_( InputArray _points1, InputArray _points2,
+                             InputArray cameraMatrix1, InputArray cameraMatrix2,
+                             int method, double prob, double threshold, OutputArray _mask)
+{
+    // Scale the points back. We use "arithmetic mean" between the supplied two camera matrices.
```

Review comment:
findEssentialMat also calls undistortPoints internally. If you want to provide new wrapper, it should be efficient. Otherwise users can do all of that on their side using already existed API just using ten lines.
**File:** modules/calib3d/test/test_cameracalibration.cpp
**Change Type:** modified
**Context:** PR #20636: Recover pose from different cameras (version 2)

**Code Changes:**
```diff
@@ -2142,7 +2142,17 @@ TEST(CV_RecoverPoseTest, regression_15341)
 
     // camera matrix with both focal lengths = 1, and principal point = (0, 0)
     const Mat cameraMatrix = Mat::eye(3, 3, CV_64F);
-    const Mat zeroDistCoeffs = Mat::zeros(1, 5, CV_64F);
+
+    // camera matrix with focal lengths 0.5 and 0.6 respectively and principal point = (100, 200)
+    double cameraMatrix2Data[] = { 0.5, 0, 100,
+                                   0, 0.6, 200,
+                                   0, 0, 1 };
```

Review comment:
> zeroDistCoeffs Non-zero distortion case should be tested too as new API suggests these parameters.
**File:** modules/calib3d/src/five-point.cpp
**Change Type:** modified
**Context:** PR #20636: Recover pose from different cameras (version 2)
**Review Line:** 494

**Code Changes:**
```diff
@@ -401,6 +401,29 @@ class EMEstimatorCallback CV_FINAL : public PointSetRegistrator::Callback
     }
 };
 
+// Find essential matrix given undistorted points and two cameras.
+static Mat findEssentialMat_( InputArray _points1, InputArray _points2,
+                             InputArray cameraMatrix1, InputArray cameraMatrix2,
+                             int method, double prob, double threshold, OutputArray _mask)
+{
+    // Scale the points back. We use "arithmetic mean" between the supplied two camera matrices.
+    // Thanks to such 2-stage procedure RANSAC threshold still makes sense, because the undistorted
+    // and rescaled points have a similar value range to the original ones.
+    Mat _pointsTransformed1, _pointsTransformed2;
+    Mat cm1 = cameraMatrix1.getMat(), cm2 = cameraMatrix2.getMat(), cm0;
+    Mat(cm1 + cm2).convertTo(cm0, CV_64F, 0.5);
```

Review comment:
Undistorted is misspelled in original code.
**File:** modules/calib3d/src/five-point.cpp
**Change Type:** modified
**Context:** PR #20636: Recover pose from different cameras (version 2)
**Review Line:** 419

**Code Changes:**
```diff
+    Mat(cm1 + cm2).convertTo(cm0, CV_64F, 0.5);
+    CV_Assert(cm0.rows == 3 && cm0.cols == 3);
+    CV_Assert(std::abs(cm0.at<double>(2, 0)) < 1e-3 &&
+              std::abs(cm0.at<double>(2, 1)) < 1e-3 &&
+              std::abs(cm0.at<double>(2, 2) - 1.) < 1e-3);
+    Mat affine = cm0.rowRange(0, 2);
+
+    transform(_points1, _pointsTransformed1, affine);
+    transform(_points2, _pointsTransformed2, affine);
+
+    return findEssentialMat(_pointsTransformed1, _pointsTransformed2, cm0, method, prob, threshold, _mask);
```

Review comment:
> `CV_Assert(cm0.rows == 3 && cm0.cols == 3);` `.rowRange()` is no-op?
**File:** modules/calib3d/src/five-point.cpp
**Change Type:** modified
**Context:** PR #20636: Recover pose from different cameras (version 2)

**Code Changes:**
```diff
@@ -401,6 +401,29 @@ class EMEstimatorCallback CV_FINAL : public PointSetRegistrator::Callback
     }
 };
 
+// Find essential matrix given undistorted points and two cameras.
+static Mat findEssentialMat_( InputArray _points1, InputArray _points2,
+                             InputArray cameraMatrix1, InputArray cameraMatrix2,
+                             int method, double prob, double threshold, OutputArray _mask)
+{
+    // Scale the points back. We use "arithmetic mean" between the supplied two camera matrices.
```

Review comment:
Consider adding underscore `_` suffix for internal names to avoid confusion with public API: `findEssentialMat_`
**File:** modules/calib3d/src/five-point.cpp
**Change Type:** modified
**Context:** PR #20636: Recover pose from different cameras (version 2)
**Review Line:** 419

**Code Changes:**
```diff
+    Mat(cm1 + cm2).convertTo(cm0, CV_64F, 0.5);
+    CV_Assert(cm0.rows == 3 && cm0.cols == 3);
+    CV_Assert(std::abs(cm0.at<double>(2, 0)) < 1e-3 &&
+              std::abs(cm0.at<double>(2, 1)) < 1e-3 &&
+              std::abs(cm0.at<double>(2, 2) - 1.) < 1e-3);
+    Mat affine = cm0.rowRange(0, 2);
+
+    transform(_points1, _pointsTransformed1, affine);
+    transform(_points2, _pointsTransformed2, affine);
+
+    return findEssentialMat(_pointsTransformed1, _pointsTransformed2, cm0, method, prob, threshold, _mask);
```

Review comment:
Calling `.rowRange()` is necessary as it allows the first 2 rows of `cm0` to be the 3rd argument of `cv::transform`. There, it's used to transform points in `_points1` and `_points2`. The 3rd argument of `cv::transform` must be 2-by-2 or 2-by-3 as per [docs](https://docs.opencv.org/4.5.3/d2/de8/group__core__array.html#ga393164aa54bb9169ce0a8cc44e08ff22). The logic in this function is not new to this PR. It originates from #17816.
**File:** modules/dnn/include/opencv2/dnn/dnn.hpp
**Change Type:** modified
**Context:** PR #20813: Add SoftNMS implementation

**Code Changes:**
```diff
@@ -1130,6 +1130,39 @@ CV__DNN_INLINE_NS_BEGIN
                              CV_OUT std::vector<int>& indices,
                              const float eta = 1.f, const int top_k = 0);
 
+    /**
+     * @brief Enum of Soft NMS methods.
+     * @see softNMSBoxes
+     */
+    enum class SoftNMSMethod
+    {
```

Review comment:
> SoftNMSBoxes Please use `softNMSBoxes` according to https://github.com/opencv/opencv/wiki/Coding_Style_Guide#naming-conventions
**File:** modules/objdetect/src/face_recognize.cpp
**Change Type:** added
**Context:** PR #20422: Add DNN-based face detection and face recognition into modules/objdetect

**Code Changes:**
```diff
@@ -0,0 +1,182 @@
+// This file is part of OpenCV project.
+// It is subject to the license terms in the LICENSE file found in the top-level directory
+// of this distribution and at http://opencv.org/license.html.
+
+#include "precomp.hpp"
+
+#include "opencv2/dnn.hpp"
+
+#include <algorithm>
```

Review comment:
imho it needs a clone() here, else the 2nd run of the network overwrites the 1st (shallow copy of the network's last layer) and both features are the same heh, you had it correct [in your previous version](https://github.com/fengyuentau/opencv_contrib/blob/646bf6d3fcafcae1fe8339ded70a52e3d96e53bf/modules/dnn_face/src/face_reg.cpp#L20)
**File:** modules/objdetect/include/opencv2/objdetect/face.hpp
**Change Type:** added
**Context:** PR #20422: Add DNN-based face detection and face recognition into modules/objdetect
**Review Line:** 82

**Code Changes:**
```diff
+                                              float nms_threshold = 0.3f,
+                                              int top_k = 5000,
+                                              int backend_id = 0,
+                                              int target_id = 0);
+};
+
+/** @brief DNN-based face recognizer, model download link: https://drive.google.com/file/d/1ClK9WiB492c5OZFKveF3XiHCejoOxINW/view.
+ */
+class CV_EXPORTS_W FaceRecognizerSF
+{
+public:
```

Review comment:
maybe add a download link to the model here ?
**File:** modules/objdetect/src/face_recognize.cpp
**Change Type:** added
**Context:** PR #20422: Add DNN-based face detection and face recognition into modules/objdetect

**Code Changes:**
```diff
@@ -0,0 +1,182 @@
+// This file is part of OpenCV project.
+// It is subject to the license terms in the LICENSE file found in the top-level directory
+// of this distribution and at http://opencv.org/license.html.
+
+#include "precomp.hpp"
+
+#include "opencv2/dnn.hpp"
+
+#include <algorithm>
```

Review comment:
float, not double (reason for all the NaN's later) also, row index 0, not 1
**File:** modules/objdetect/include/opencv2/objdetect/face.hpp
**Change Type:** added
**Context:** PR #20422: Add DNN-based face detection and face recognition into modules/objdetect
**Review Line:** 60

**Code Changes:**
```diff
+    /** @brief A simple interface to detect face from given image
+     *
+     *  @param image an image to detect
+     *  @param faces detection results stored in a cv::Mat
+     */
+    CV_WRAP virtual int detect(InputArray image, OutputArray faces) = 0;
+
+    /** @brief Creates an instance of this class with given parameters
+     *
+     *  @param model the path to the requested model
+     *  @param config the path to the config file for compability, which is not requested for ONNX models
```

Review comment:
I think, we need some standard, specification, which landmarks represent what. Perhaps, the first 5 landmarks should be the eyes (in the specified order, e.g. left, then right), nose and the mouth left's and right's point, then all the other, more detailed landmarks (if any).
**File:** modules/objdetect/include/opencv2/objdetect/face.hpp
**Change Type:** added
**Context:** PR #20422: Add DNN-based face detection and face recognition into modules/objdetect

**Code Changes:**
```diff
@@ -0,0 +1,125 @@
+// This file is part of OpenCV project.
+// It is subject to the license terms in the LICENSE file found in the top-level directory
+// of this distribution and at http://opencv.org/license.html.
+
+#ifndef OPENCV_OBJDETECT_FACE_HPP
+#define OPENCV_OBJDETECT_FACE_HPP
+
+#include <opencv2/core.hpp>
+
```

Review comment:
1. there must be 2 filenames specified, and onnx_ prefix should not be used. We should not give any preference to one particular network. 2. I think, there should be properties to adjust input size, as well as the score & nms thresholds, as well as top_k parameters dynamically, to achieve the optimal speed/quality ratio.
**File:** modules/objdetect/include/opencv2/objdetect/face.hpp
**Change Type:** added
**Context:** PR #20422: Add DNN-based face detection and face recognition into modules/objdetect

**Code Changes:**
```diff
@@ -0,0 +1,125 @@
+// This file is part of OpenCV project.
+// It is subject to the license terms in the LICENSE file found in the top-level directory
+// of this distribution and at http://opencv.org/license.html.
+
+#ifndef OPENCV_OBJDETECT_FACE_HPP
+#define OPENCV_OBJDETECT_FACE_HPP
+
+#include <opencv2/core.hpp>
+
```

Review comment:
I suggest to remove DNN prefix from the face detector and face recognizer. I think, in the nearest 20+ years such algorithms will all use deep learning technology.
**File:** modules/objdetect/include/opencv2/objdetect/face.hpp
**Change Type:** added
**Context:** PR #20422: Add DNN-based face detection and face recognition into modules/objdetect

**Code Changes:**
```diff
@@ -0,0 +1,125 @@
+// This file is part of OpenCV project.
+// It is subject to the license terms in the LICENSE file found in the top-level directory
+// of this distribution and at http://opencv.org/license.html.
+
+#ifndef OPENCV_OBJDETECT_FACE_HPP
+#define OPENCV_OBJDETECT_FACE_HPP
+
+#include <opencv2/core.hpp>
+
```

Review comment:
start method name with lowercase letter for consistency
**File:** modules/objdetect/include/opencv2/objdetect/face.hpp
**Change Type:** added
**Context:** PR #20422: Add DNN-based face detection and face recognition into modules/objdetect

**Code Changes:**
```diff
@@ -0,0 +1,125 @@
+// This file is part of OpenCV project.
+// It is subject to the license terms in the LICENSE file found in the top-level directory
+// of this distribution and at http://opencv.org/license.html.
+
+#ifndef OPENCV_OBJDETECT_FACE_HPP
+#define OPENCV_OBJDETECT_FACE_HPP
+
+#include <opencv2/core.hpp>
+
```

Review comment:
same comment about onnx_path + there should be 2 file names.
**File:** modules/objdetect/include/opencv2/objdetect/face.hpp
**Change Type:** added
**Context:** PR #20422: Add DNN-based face detection and face recognition into modules/objdetect

**Code Changes:**
```diff
@@ -0,0 +1,125 @@
+// This file is part of OpenCV project.
+// It is subject to the license terms in the LICENSE file found in the top-level directory
+// of this distribution and at http://opencv.org/license.html.
+
+#ifndef OPENCV_OBJDETECT_FACE_HPP
+#define OPENCV_OBJDETECT_FACE_HPP
+
+#include <opencv2/core.hpp>
+
```

Review comment:
using string for distype is bad practice. Use enumeration
**File:** modules/objdetect/src/face_detect.cpp
**Change Type:** added
**Context:** PR #20422: Add DNN-based face detection and face recognition into modules/objdetect

**Code Changes:**
```diff
@@ -0,0 +1,288 @@
+// This file is part of OpenCV project.
+// It is subject to the license terms in the LICENSE file found in the top-level directory
+// of this distribution and at http://opencv.org/license.html.
+
+#include "precomp.hpp"
+
+#include "opencv2/imgproc.hpp"
+#include "opencv2/core.hpp"
+#include "opencv2/dnn.hpp"
```

Review comment:
since it's internal class, do not use default values in the constructor, otherwise you may get some difficult-to-catch bugs; instead, specify all the parameters explicitly inside DNNFaceDetector::create() implementation
**File:** modules/objdetect/include/opencv2/objdetect/face.hpp
**Change Type:** added
**Context:** PR #20422: Add DNN-based face detection and face recognition into modules/objdetect
**Review Line:** 60

**Code Changes:**
```diff
+    /** @brief A simple interface to detect face from given image
+     *
+     *  @param image an image to detect
+     *  @param faces detection results stored in a cv::Mat
+     */
+    CV_WRAP virtual int detect(InputArray image, OutputArray faces) = 0;
+
+    /** @brief Creates an instance of this class with given parameters
+     *
+     *  @param model the path to the requested model
+     *  @param config the path to the config file for compability, which is not requested for ONNX models
```

Review comment:
Currently I defined the landmarks as the order you said. There are several standards in term of facial landmarks, such as 5-landmark definition that we used, [68-landmark definition](https://ibug.doc.ic.ac.uk/resources/300-W/), [98-landmark definition](https://wywu.github.io/projects/LAB/WFLW.html), [21-landmark definition](https://www.tugraz.at/institute/icg/research/team-bischof/lrs/downloads/aflw/) and maybe more. The order of landmarks vary from different definitions. We need a serious discussion on this issue.
**File:** modules/objdetect/include/opencv2/objdetect/face.hpp
**Change Type:** added
**Context:** PR #20422: Add DNN-based face detection and face recognition into modules/objdetect

**Code Changes:**
```diff
@@ -0,0 +1,125 @@
+// This file is part of OpenCV project.
+// It is subject to the license terms in the LICENSE file found in the top-level directory
+// of this distribution and at http://opencv.org/license.html.
+
+#ifndef OPENCV_OBJDETECT_FACE_HPP
+#define OPENCV_OBJDETECT_FACE_HPP
+
+#include <opencv2/core.hpp>
+
```

Review comment:
> 1. there must be 2 filenames specified, and onnx_ prefix should not be used. We should not give any preference to one particular network. Do you mean something like this? https://github.com/opencv/opencv/blob/b61a55eebf1e654106bde3222e926d0e5b8edbca/modules/dnn/include/opencv2/dnn/dnn.hpp#L1514-L1516 I was thinking our target was a specific implementation on our face detection model. It is not feasible to make it a one-for-all implementation since different models have different settings in prior boxes and different encoding & decoding processes. > 2. I think, there should be properties to adjust input size, as well as the score & nms thresholds, as well as top_k parameters dynamically, to achieve the optimal speed/quality ratio. Done.
**File:** modules/objdetect/include/opencv2/objdetect/face.hpp
**Change Type:** added
**Context:** PR #20422: Add DNN-based face detection and face recognition into modules/objdetect

**Code Changes:**
```diff
@@ -0,0 +1,125 @@
+// This file is part of OpenCV project.
+// It is subject to the license terms in the LICENSE file found in the top-level directory
+// of this distribution and at http://opencv.org/license.html.
+
+#ifndef OPENCV_OBJDETECT_FACE_HPP
+#define OPENCV_OBJDETECT_FACE_HPP
+
+#include <opencv2/core.hpp>
+
```

Review comment:
Done at https://github.com/opencv/opencv/pull/20422/commits/e974a0279b23ce7132866fcf00eca176919e05c9.
**File:** modules/objdetect/src/face_detect.cpp
**Change Type:** added
**Context:** PR #20422: Add DNN-based face detection and face recognition into modules/objdetect

**Code Changes:**
```diff
@@ -0,0 +1,288 @@
+// This file is part of OpenCV project.
+// It is subject to the license terms in the LICENSE file found in the top-level directory
+// of this distribution and at http://opencv.org/license.html.
+
+#include "precomp.hpp"
+
+#include "opencv2/imgproc.hpp"
+#include "opencv2/core.hpp"
+#include "opencv2/dnn.hpp"
```

Review comment:
Done at https://github.com/opencv/opencv/pull/20422/commits/c25681e451a632c0a1eb74c92f800f04251d8640.
**File:** modules/objdetect/src/face_detect.cpp
**Change Type:** added
**Context:** PR #20422: Add DNN-based face detection and face recognition into modules/objdetect
**Review Line:** 49

**Code Changes:**
```diff
+    void setInputSize(const Size& input_size) override
+    {
+        inputW = input_size.width;
+        inputH = input_size.height;
+        generatePriors();
+    }
+
+    Size getInputSize() override
+    {
+        Size input_size;
+        input_size.width = inputW;
```

Review comment:
regenerate the priors ?
**File:** modules/objdetect/src/face_detect.cpp
**Change Type:** added
**Context:** PR #20422: Add DNN-based face detection and face recognition into modules/objdetect
**Review Line:** 49

**Code Changes:**
```diff
+    void setInputSize(const Size& input_size) override
+    {
+        inputW = input_size.width;
+        inputH = input_size.height;
+        generatePriors();
+    }
+
+    Size getInputSize() override
+    {
+        Size input_size;
+        input_size.width = inputW;
```

Review comment:
Done at https://github.com/opencv/opencv/pull/20422/commits/2416377176bea00c612f677d7f0ec7b326c3cd36.