# End Caps of TubeGeometry

**URL:** <https://discourse.threejs.org/t/end-caps-of-tubegeometry/9655>\
**Category:** Questions\
**Tags:** geometry\
**Created:** [September 15, 2019, 10:48pm UTC](https://discourse.threejs.org/t/end-caps-of-tubegeometry/9655 "2019-09-15T22:48:02Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![waqast](https://avatars.discourse-cdn.com/v4/letter/w/e0b2c6/32.png) [@waqast](https://discourse.threejs.org/u/waqast)\
**Post date:** [September 15, 2019, 10:48pm UTC](https://discourse.threejs.org/t/end-caps-of-tubegeometry/9655/1 "2019-09-15T22:48:02Z")

</div>

I have an arbitrary tubeGeometry made from a curved path.  
How can I add End Caps to it.  
Don’t want hollow tube.

---

<div class="post-metadata">

**Author:** ![Mugen87](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.threejs.org/mugen87/32/5645_2.png) [@Mugen87](https://discourse.threejs.org/u/Mugen87)\
**Post date:** [September 16, 2019, 9:07am UTC](https://discourse.threejs.org/t/end-caps-of-tubegeometry/9655/2 "2019-09-16T09:07:27Z")

</div>

It’s not possible to apply end caps, you can only _close_ a tube like demonstrated in this example:

[https://threejs.org/examples/webgl\_geometry\_extrude\_splines](https://threejs.org/examples/webgl_geometry_extrude_splines)

Check/uncheck the “closed” checkbox to see the different.

---

<div class="post-metadata">

**Author:** ![hofk](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.threejs.org/hofk/32/44944_2.png) [@hofk](https://discourse.threejs.org/u/hofk)\
**Post date:** [September 16, 2019, 9:47am UTC](https://discourse.threejs.org/t/end-caps-of-tubegeometry/9655/3 "2019-09-16T09:47:09Z")

</div>

> [@waqast](#):
>
> I have an arbitrary tubeGeometry made from a curved path.  
> How can I add End Caps to it.  
> Don’t want hollow tube.

Do you mean something like that? (example 0.4 \* Math.sin( Math.PI \* 2 \* v ))

 ![00](https://canada1.discourse-cdn.com/flex035/uploads/threejs/original/2X/5/5ec2493374ed8771e776b7dcb3538cb31cc2b4f6.png)

You can do things like that with my addon THREEf. [Addon. Produces almost infinite many time-varying geometries with functions](https://discourse.threejs.org/t/addon-produces-almost-infinite-many-time-varying-geometries-with-functions/262)

[hofk (Klaus Hoffmeister) · GitHub](https://github.com/hofk)

examples [https://hofk.de/main/threejs/sandboxthreef/examplesTHREEf%20r90.html](https://hofk.de/main/threejs/sandboxthreef/examplesTHREEf%20r90.html)

[https://hofk.de/main/threejs/sandboxthreef/formLibrary.html](https://hofk.de/main/threejs/sandboxthreef/formLibrary.html)  
e.g.

```
//0011 curved cylinder @author hofk 
 withBottom:	true,
 moveX: function ( u, v, t ) { return Math.exp( -200 * v * v * v * v ) }

```

![curved%20_cylinder](https://canada1.discourse-cdn.com/flex035/uploads/threejs/original/2X/a/a966456212b4a352941563d2c263c31ad97cc67f.png)

---

<div class="post-metadata">

**Author:** ![wenrenqiang](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.threejs.org/wenrenqiang/32/54020_2.png) [@wenrenqiang](https://discourse.threejs.org/u/wenrenqiang)\
**Post date:** [September 16, 2019, 10:57am UTC](https://discourse.threejs.org/t/end-caps-of-tubegeometry/9655/4 "2019-09-16T10:57:24Z")

</div>

How to find the correct mathematical formula

---

<div class="post-metadata">

**Author:** ![waqast](https://avatars.discourse-cdn.com/v4/letter/w/e0b2c6/32.png) [@waqast](https://discourse.threejs.org/u/waqast)\
**Post date:** [September 16, 2019, 12:17pm UTC](https://discourse.threejs.org/t/end-caps-of-tubegeometry/9655/5 "2019-09-16T12:17:14Z")

</div>

How to get Starting and Ending Cap Vertices (Blue) to make a shape (like Red) out of them and use the shape as End Caps?

![tube_endcap_01](https://canada1.discourse-cdn.com/flex035/uploads/threejs/original/2X/8/80945525b7ee6e3dbbe7a242c97c65358970a43a.png)

---

<div class="post-metadata">

**Author:** ![prisoner849](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.threejs.org/prisoner849/32/535_2.png) [@prisoner849](https://discourse.threejs.org/u/prisoner849)\
**Post date:** [September 16, 2019, 2:25pm UTC](https://discourse.threejs.org/t/end-caps-of-tubegeometry/9655/6 "2019-09-16T14:25:45Z")

</div>

Not so difficult, actually.  
You know amount of radial segments, you know amount of tubular segments, so you can get information about vertices of start and end segments:  
 ![TubePoints](https://canada1.discourse-cdn.com/flex035/uploads/threejs/original/2X/2/21ebfc5177aa4483d6da95f628c758c0f6c84365.png)  
[https://jsfiddle.net/prisoner849/6jp3snvq/](https://jsfiddle.net/prisoner849/6jp3snvq/)

Another thing you’ll need are points for start and end of the curve.  
Something like:

```javascript
var curve = _your_curve_;
var pointStart = curve.getPoint(0);
var pointEnd = curve.getPoint(1);

```

![TubePointsWithCenters](https://canada1.discourse-cdn.com/flex035/uploads/threejs/original/2X/b/b6481c00379f6c2af36713cc7d3a88442d44c6bc.png)  
[https://jsfiddle.net/prisoner849/25mLpg3r/](https://jsfiddle.net/prisoner849/25mLpg3r/)

The last thing is to set `.index` for geometries so you’ll have faces:  
 ![TubePointsWithCentersAndEndCaps](https://canada1.discourse-cdn.com/flex035/uploads/threejs/original/2X/f/f465bd5ca24904b7f62d456264545e39e6f07694.png)  
[https://jsfiddle.net/prisoner849/yueLpdb2/](https://jsfiddle.net/prisoner849/yueLpdb2/)

Or you can set index without setting that mid point, using just points of the tube’s ends 🙂 Creativity is up to you 😊

---

<div class="post-metadata">

**Author:** ![waqast](https://avatars.discourse-cdn.com/v4/letter/w/e0b2c6/32.png) [@waqast](https://discourse.threejs.org/u/waqast)\
**Post date:** [September 16, 2019, 10:08pm UTC](https://discourse.threejs.org/t/end-caps-of-tubegeometry/9655/7 "2019-09-16T22:08:37Z")

</div>

Your code makes new meshes for end caps. how to make end caps part of the tube?

---

<div class="post-metadata">

**Author:** ![prisoner849](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.threejs.org/prisoner849/32/535_2.png) [@prisoner849](https://discourse.threejs.org/u/prisoner849)\
**Post date:** [September 16, 2019, 10:21pm UTC](https://discourse.threejs.org/t/end-caps-of-tubegeometry/9655/8 "2019-09-16T22:21:16Z")

</div>

The code creates geometries. I use meshes just to visualize the result.  
Use [`THREE.BufferGeometryUtils.mergeBufferGeometries()`](https://threejs.org/docs/index.html#examples/en/utils/BufferGeometryUtils.mergeBufferGeometries) to make caps part of the tube.

---

<div class="post-metadata">

**Author:** ![Anil\_Sehgal](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.threejs.org/anil_sehgal/32/10797_2.png) [@Anil\_Sehgal](https://discourse.threejs.org/u/Anil_Sehgal)\
**Post date:** [May 8, 2020, 4:26pm UTC](https://discourse.threejs.org/t/end-caps-of-tubegeometry/9655/9 "2020-05-08T16:26:18Z")

</div>

[I extended it with a convex geometry to cover the tip](https://jsfiddle.net/6yfjc2ur/3/)

---

<div class="post-metadata">

**Author:** ![Lawrence3DPK](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.threejs.org/lawrence3dpk/32/29184_2.png) [@Lawrence3DPK](https://discourse.threejs.org/u/Lawrence3DPK)\
**Post date:** [April 8, 2021, 3:54pm UTC](https://discourse.threejs.org/t/end-caps-of-tubegeometry/9655/10 "2021-04-08T15:54:07Z")

</div>

is it possible and would you know how to close the gap between theta start and theta length if it is not a complete cylinder by any chance?

heres a visual reference to what i mean…

![image](https://canada1.discourse-cdn.com/flex035/uploads/threejs/original/3X/8/3/83be1795659ab8cef3a9e750385842f1b675e8be.png)

where the orange outlines would make up “solid” faces?

---

<div class="post-metadata">

**Author:** ![prisoner849](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.threejs.org/prisoner849/32/535_2.png) [@prisoner849](https://discourse.threejs.org/u/prisoner849)\
**Post date:** [April 8, 2021, 4:52pm UTC](https://discourse.threejs.org/t/end-caps-of-tubegeometry/9655/11 "2021-04-08T16:52:06Z")

</div>

@Lawrence3DPK  
Somehow your question is similar to these topic and post: [Group And Animate Meshes - #8 by prisoner849](https://discourse.threejs.org/t/group-and-animate-meshes/22003/8)

---

<div class="post-metadata">

**Author:** ![Lawrence3DPK](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.threejs.org/lawrence3dpk/32/29184_2.png) [@Lawrence3DPK](https://discourse.threejs.org/u/Lawrence3DPK)\
**Post date:** [April 8, 2021, 6:04pm UTC](https://discourse.threejs.org/t/end-caps-of-tubegeometry/9655/12 "2021-04-08T18:04:37Z")

</div>

Agreed it is, i used the image of the cylinder for simplicity sake, i actually intend to try and use the same principle for a sphere with less phi length, like so…

![image](https://canada1.discourse-cdn.com/flex035/uploads/threejs/original/3X/c/b/cb157608d08c88717e62cc7fbd78e9f1f675659a.png)

which i guess has the same principle but i can only imagine a lot more difficult to work out, do you know if someone has achived this before?

---

<div class="post-metadata">

**Author:** ![hofk](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.threejs.org/hofk/32/44944_2.png) [@hofk](https://discourse.threejs.org/u/hofk)\
**Post date:** [April 8, 2021, 6:11pm UTC](https://discourse.threejs.org/t/end-caps-of-tubegeometry/9655/13 "2021-04-08T18:11:48Z")

</div>

I have done something like this in my [Addon. Produces almost infinite many time-varying geometries with functions - #24 by hofk](https://discourse.threejs.org/t/addon-produces-almost-infinite-many-time-varying-geometries-with-functions/262/24).

![2021-04-08 20.07.07](https://canada1.discourse-cdn.com/flex035/uploads/threejs/original/3X/6/b/6b1e13b2d7891bede39dde446acabfb2d2ef4543.jpeg)

However, the code is not easy to keep track of.

> **[hofk/THREEp.js](https://github.com/hofk/THREEp.js)**
>
> three.js addon, to produce almost infinite many time-varying geometries / buffer geometries with polar / spherical coordinate functions

---

<div class="post-metadata">

**Author:** ![Lawrence3DPK](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.threejs.org/lawrence3dpk/32/29184_2.png) [@Lawrence3DPK](https://discourse.threejs.org/u/Lawrence3DPK)\
**Post date:** [April 8, 2021, 6:16pm UTC](https://discourse.threejs.org/t/end-caps-of-tubegeometry/9655/14 "2021-04-08T18:16:25Z")

</div>

> [@hofk](#):
>
> However, the code is not easy to keep track of.

yeah, was just looking into the link you sent, thanks for the link man, gonna give it a shot but honestly it doesn’t look easy aha.

---

<div class="post-metadata">

**Author:** ![hofk](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.threejs.org/hofk/32/44944_2.png) [@hofk](https://discourse.threejs.org/u/hofk)\
**Post date:** [April 8, 2021, 6:20pm UTC](https://discourse.threejs.org/t/end-caps-of-tubegeometry/9655/15 "2021-04-08T18:20:47Z")

</div>

> [@Lawrence3DPK](#):
>
> yeah, was just looking into the link you sent, thanks for the link man, gonna give it a shot but honestly it doesn’t look easy aha.

The thing itself is not so complicated, the problem is the embedding in the complex addon.

I myself have problems when I want to extract a piece from one of my addons for a simple thing.

Look for wedges.

---

<div class="post-metadata">

**Author:** ![prisoner849](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.threejs.org/prisoner849/32/535_2.png) [@prisoner849](https://discourse.threejs.org/u/prisoner849)\
**Post date:** [April 9, 2021, 8:33am UTC](https://discourse.threejs.org/t/end-caps-of-tubegeometry/9655/16 "2021-04-09T08:33:01Z")

</div>

To build such a sphere, you need one sphere and two half-circles.  
**Example** : [https://jsfiddle.net/prisoner849/cLqrghdm/](https://jsfiddle.net/prisoner849/cLqrghdm/)

**Picture** :

 ![изображение](https://canada1.discourse-cdn.com/flex035/uploads/threejs/original/3X/5/8/58f1fda4ed09db6692143cf9225f27471d505a1d.png)

**Code** :

```javascript
let r = 2.5;
let wS = 16;
let hS = 8;
let phiStart = Math.PI;
let phiLength = Math.PI * 1.35;

let gSphere = new THREE.SphereGeometry(r, wS, hS, phiStart, phiLength);
let gCircle1 = new THREE.CircleGeometry(r, hS, Math.PI * 1.5, Math.PI);
gCircle1.rotateY(Math.PI + phiStart);
let gCircle2 = new THREE.CircleGeometry(r, hS, Math.PI * 0.5, Math.PI);
gCircle2.rotateY(phiStart + phiLength);
let g = BufferGeometryUtils.mergeBufferGeometries([gSphere, gCircle1, gCircle2]);

let m = new THREE.MeshPhongMaterial({color: 0x007fff, flatShading: true});

let o = new THREE.Mesh(g, m);
scene.add(o);

```

---

<div class="post-metadata">

**Author:** ![Lawrence3DPK](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.threejs.org/lawrence3dpk/32/29184_2.png) [@Lawrence3DPK](https://discourse.threejs.org/u/Lawrence3DPK)\
**Post date:** [April 9, 2021, 9:13am UTC](https://discourse.threejs.org/t/end-caps-of-tubegeometry/9655/17 "2021-04-09T09:13:46Z")

</div>

@prisoner849 Ahh man!! no way!! that’s really cool of you! i was going off of your example from yesterday and going the ultra long route by creating BufferGeometry from points, i got 2 faces together last night and it was proving to be a very long task…

```
    let sg = new THREE.BufferGeometry().setFromPoints(
    [
    new THREE.Vector3(0, cH, 0),
    new THREE.Vector3(-1+cH*0.8125,1-cH*0.015625, 0),//.applyAxisAngle(new THREE.Vector3(0, 1, 0), perc1 * Math.PI /180),
    new THREE.Vector3(0, 0, 0),
    new THREE.Vector3(-1+cH*0.8125,1-cH*0.015625, 0),//.applyAxisAngle(new THREE.Vector3(0, 1, 0), perc1 * Math.PI /180),
    new THREE.Vector3(-1+cH*0.609375,1-cH*0.078125, 0),//.applyAxisAngle(new THREE.Vector3(0, 1, 0), perc1 * Math.PI /180),
    new THREE.Vector3(0, 0, 0)
    // new THREE.Vector3(0, cH * 0.3125, 0.1875),
    // new THREE.Vector3(0, cH * 0.25, 0.25),
    // new THREE.Vector3(0, cH * 0.1875, 0.3125),
    // new THREE.Vector3(0, cH * 0.125, 0.375),
    // new THREE.Vector3(0, cH * 0.0625, 0.4375),
    // new THREE.Vector3(0, cH * 0, ch * 0.5),
    // new THREE.Vector3(0, cH * -0.0625, 0.4375),
    // new THREE.Vector3(0, cH * -0.125, 0.375),
    // new THREE.Vector3(0, cH * -0.1875, 0.3125),
    // new THREE.Vector3(0, cH * -0.25, 0.25),
    // new THREE.Vector3(0, cH * -0.3125, 0.1875),
    // new THREE.Vector3(0, cH * -0.375, 0.125),
    // new THREE.Vector3(0, cH * -0.4375, 0.0625),
    //new THREE.Vector3(0, cH * -0.5, 0)
  ]
);
sg.addGroup(0, 3, 0);
sg.setIndex([0, 1, 2, 3, 4, 5]);
sg.setAttribute("uv", new THREE.Float32BufferAttribute([
    0, 1, 0, 0, 1, 0
], 2));
sg.computeVertexNormals();

```

as you can see i barely got to creating points for the third face and ran into quite a complexity of number calculations…

the approach you’ve provided should be a little simpler aha!! i will give it a go and let you know!!

Thanks so much man!!

---

<div class="post-metadata">

**Author:** ![Lawrence3DPK](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.threejs.org/lawrence3dpk/32/29184_2.png) [@Lawrence3DPK](https://discourse.threejs.org/u/Lawrence3DPK)\
**Post date:** [April 9, 2021, 10:19am UTC](https://discourse.threejs.org/t/end-caps-of-tubegeometry/9655/18 "2021-04-09T10:19:28Z")

</div>

@prisoner849 Worked a charm!! you’re work is amazing so i really appreciate your help with such a simple mundane task!!

---

<div class="post-metadata">

**Author:** ![prisoner849](https://yyz1.discourse-cdn.com/flex035/user_avatar/discourse.threejs.org/prisoner849/32/535_2.png) [@prisoner849](https://discourse.threejs.org/u/prisoner849)\
**Post date:** [April 9, 2021, 12:06pm UTC](https://discourse.threejs.org/t/end-caps-of-tubegeometry/9655/19 "2021-04-09T12:06:25Z")

</div>

@Lawrence3DPK you’re welcome 🍻

---

<div class="post-metadata">

**Author:** ![Bob55](https://avatars.discourse-cdn.com/v4/letter/b/e9c0ed/32.png) [@Bob55](https://discourse.threejs.org/u/Bob55)\
**Post date:** [January 19, 2024, 7:26pm UTC](https://discourse.threejs.org/t/end-caps-of-tubegeometry/9655/20 "2024-01-19T19:26:01Z")

</div>

Hi everyone,

I know this is an old question but I am struggling with this for a while now and need some advice or suggestion to get unstuck. I am using r160 and I am a beginner at three.js.

I implemented end caps for a tube geometry using a solution posted by @prisoner849 in a jsfiddle back in September '19, and it’s working nicely. Now, I want to merge the end caps into the tube geometry using `BufferGeometryUtils.mergeGeometries()`, but I’m encountering an error:

```javascript
BufferGeometryUtils.js:160 THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index 1. Make sure all geometries have the same number of attributes.
mergeGeometries @ BufferGeometryUtils.js:160
addObject @ example.html:119
(anonymous) @ example.html:150
three.module.js:11634 Uncaught TypeError: Cannot read properties of null (reading 'morphAttributes')
    at Mesh.updateMorphTargets (three.module.js:11634:36)
    at new Mesh (three.module.js:11603:8)
    at addObject (example.html:125:30)
    at example.html:150:5

```

It seems there’s an issue with the number of attributes, and I am currently clueless about it. I have attached my current code below:

```javascript
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Three.js Example</title>
    <style>
        body { margin: 0; }
    </style>
        <script async src="https://unpkg.com/es-module-shims@1.6.3/dist/es-module-shims.js"></script>
        <script type="importmap">
          {
            "imports": {
              "three": "https://unpkg.com/three@v0.160.0/build/three.module.js",
              "three/addons/": "https://unpkg.com/three@v0.160.0/examples/jsm/"
            }
          }
        </script>
</head>
<body>

<script type="module">
    import * as THREE from 'three';
    import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
    import { TransformControls } from 'three/addons/controls/TransformControls.js';
    import * as BufferGeometryUtils from 'three/addons/utils/BufferGeometryUtils.js';

    const scene = new THREE.Scene();
    const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
    const renderer = new THREE.WebGLRenderer();
    renderer.setSize(window.innerWidth, window.innerHeight);
    document.body.appendChild(renderer.domElement);

    const controls = new OrbitControls(camera, renderer.domElement);

        function addObject(position) {

            var curve = new THREE.CatmullRomCurve3([
                new THREE.Vector3(0.4, 0.4, 0),
                new THREE.Vector3(0, 0.4, 0),
                new THREE.Vector3(0, 0, 0)
            ]);

            var geom = new THREE.TubeGeometry(curve, 10, 0.1, 10, false);
            var mat = new THREE.MeshLambertMaterial({ color: Math.random() * 0xffffff });
            const object = new THREE.Mesh(geom, mat);

            var pos = geom.attributes.position;
            var startPoints = [];
            startPoints.push(curve.getPoint(0));
            for (let i = 0; i <= geom.parameters.radialSegments; i++) {

                startPoints.push(new THREE.Vector3().fromBufferAttribute(pos, i));

            }

            var pointsStartGeom = new THREE.BufferGeometry().setFromPoints(startPoints);
            var psgPos = pointsStartGeom.attributes.position;
            var indexStart = [];
            for (let i = 1; i < psgPos.count - 1; i++) {
                indexStart.push(0, i, i + 1);
            }
            pointsStartGeom.setIndex(indexStart);

            var shapeStart = new THREE.Mesh(pointsStartGeom, mat); 

            var endPoints = [];
            endPoints.push(curve.getPoint(1));
            for (let i = (geom.parameters.radialSegments + 1) * geom.parameters.tubularSegments; i < pos.count; i++) {

                endPoints.push(new THREE.Vector3().fromBufferAttribute(pos, i));

            }

            var pointsEndGeom = new THREE.BufferGeometry().setFromPoints(endPoints);
            var pegPos = pointsEndGeom.attributes.position;
            var indexEnd = [];
            for (let i = 1; i < pegPos.count - 1; i++) {
                indexEnd.push(0, i + 1, i);
            }
            pointsEndGeom.setIndex(indexEnd);

            var shapeEnd = new THREE.Mesh(pointsEndGeom, mat); 

            object.position.y = 0.0;

            if (position) {
                object.position.copy(position);
            } else {

                object.position.x = Math.random() * 10 - 5;
                object.position.z = Math.random() * 10 - 5;
            }

            shapeStart.position.copy(object.position);

            shapeEnd.position.copy(object.position);

            const mergedGeometry = BufferGeometryUtils.mergeGeometries([object.geometry, shapeStart.geometry, shapeEnd.geometry]);

            const tubeMaterial = new THREE.MeshLambertMaterial({ color: Math.random() * 0xffffff });

            const tubeMesh = new THREE.Mesh(mergedGeometry, tubeMaterial);

            tubeMesh.castShadow = true;
            tubeMesh.receiveShadow = true;
            scene.add(tubeMesh);
            return tubeMesh;
        }

    const light = new THREE.PointLight(0xFFFFFF, 1, 100);
    light.position.set(0, 5, 5);
    scene.add(light);

    camera.position.z = 5;

    function animate() {
        requestAnimationFrame(animate);
        controls.update();
        renderer.render(scene, camera);
    }

    addObject(new THREE.Vector3(0, 0, 0));

    animate();
</script>

</body>
</html>

```

Thank you in advance for any help or guidance!

[Next page](https://discourse.threejs.org/t/end-caps-of-tubegeometry/9655.md?page=2)
