---
title: "Ten Indian art traditions made the mood board. Two made the game."
search_title: "Kolam, Rangoli and Mandala: Indian Art in a Puzzle Game"
description: "Our Shipaton 2026 puzzle game uses kolam, rangoli and mandala, all generated by our own code. A kolam is a mirror curve: an m×n dot grid draws gcd(m, n) lines. Gond, Madhubani and Warli wait for commissioned artists, and deities and yantras stay out."
author: "Prajjwal Pathak"
published: 2026-09-13
canonical: https://cybiqon.in/lab/kolam-rangoli-mandala-indian-art-puzzle-game
tags: [Games, Shipaton, Indian Art, Procedural Generation, Mathematics, Flutter]
---

# Ten Indian art traditions made the mood board. Two made the game.

*By Prajjwal Pathak · 2026-09-13 · [https://cybiqon.in/lab/kolam-rangoli-mandala-indian-art-puzzle-game](https://cybiqon.in/lab/kolam-rangoli-mandala-indian-art-puzzle-game)*

*Renamed on 17 September 2026. The game in this post was called Curvved when it was written; it is now ChitraYatra. Apart from the name, nothing in it has changed.*

The concept board that started this was made with an image model. Across the top it says *Indian Art Traditions, Reimagined*, and below that are ten traditions, each shown twice: scrambled into hexagonal tiles and then solved. Kolam, Madhubani, Warli, Pattachitra, Kalamkari, Rajasthani miniature, Gond, Phad, rangoli, Mughal floral. It is beautiful, and it would sell the game in one screenshot.

It is also a precise picture of what we decided not to ship. One panel shows a Pattachitra goddess's face split across hexagonal tiles. Another is a Gond deer that no Gond artist drew.

We are building **[ChitraYatra](/products/chitrayatra)** for [RevenueCat Shipaton 2026](https://revenuecat-shipaton-2026.devpost.com/), whose submissions close on 30 September. This is the first post in a series about building it. The game is a drawing cut into hexagonal panes of stained glass: turn or move the panes until every line meets its neighbour, and each region of the picture lights up as glass. On 13 September we decided it should carry Indian traditions. By the end of that day, of the ten on the board, **two were in the game, kolam and rangoli, generated entirely by our own code, along with a third the board never showed: mandala, as plain geometry. Three are waiting for artists we have not yet paid. Two are shrines rather than pictures, and stay out. The last three might come later, from artists or from public-domain museum collections, but never as the board shows them.**

This post is how that sorting happened: the history of each tradition, the mathematics that made one of them almost free to implement, and the rules that kept the rest out.

## TL;DR

- **Kolam, rangoli and mandala are in the game, and all 17 of their windows are generated by code.** Kolam is a Tamil threshold drawing made every dawn in rice flour; rangoli is the festival floor art that goes by a different name in almost every state; mandala here means only "circle". Together they give the game **3 of its 5 collections and 17 of its 25 windows**, and every window passes all five of the level validator's gates.
- **A kolam is a mirror curve, so it can be generated exactly.** A line bouncing through an m×n dot grid draws **gcd(m, n)** separate loops, so coprime grids give the single unbroken line the tradition prizes. Our generator agrees on **81 of 81** grids from 1×1 to 9×9.
- **Symmetry decided which kolams we could make.** Across 16,000 samples on square grids, **no** mirror set with full eightfold symmetry kept a single line. On 5×5 and 7×7, every single-line set with only fourfold rotation (**289 of 289**) was a pinwheel, and a four-armed pinwheel reads as a swastika. So every mirrored kolam in the game is drawn on an odd-by-odd rectangle.
- **Gond, Madhubani and Warli wait for commissioned artists.** These are authored styles practised by living communities, and each carries a Geographical Indication. Under the Indian Copyright Act an assignment is only valid **in writing** (s.19), and the artist's right to object to distortion **survives the sale** (s.57). We will not generate these styles, and we will not prompt an image model to imitate them.
- **Deities and yantras are never puzzle pieces.** That rules out most of Pattachitra, Phad and temple Kalamkari. Our mandalas are secular geometry with no bindu and no interlocking triangles.

## ChitraYatra, in one paragraph

A drawing is laid under a coarse grid of 21–23 hexagonal panes. Wherever a line crosses the edge of a pane, it is snapped to one of seven evenly spaced **ports**. The panes are scrambled, and the rule is simply *no loose ends*: when every port meets the matching port on the neighbouring pane, the board **is** the drawing, exactly. Enclosed areas of the drawing fill with stained glass as soon as every pane around them is right, so the picture arrives while you play rather than being revealed at the end. There are four ways to play: rotate a pane, swap two, drag one in from a tray, or turn a ring of seven. There is no timer, no score and no way to fail. The engine is pure Dart with no Flutter, the same rule that kept [Lumina's level generator](/lab/puzzle-generator-random-walk-doesnt-work) testable, so every level can be validated in bulk from the command line before anyone plays it.

<figure>
<svg viewBox="0 36 500 180" role="img" aria-label="Two adjacent hexagonal panes with seven port positions marked on every edge. A single curved line runs through pane A, crosses the shared edge at one of the seven ports, and continues into pane B. Notes explain that a sixty-degree turn moves a port to the next edge, and that two panes mate when their facing ports match." style="width:100%;height:auto">
<polygon points="120,50 173.7,81 173.7,143 120,174 66.3,143 66.3,81" fill="none" stroke="currentColor" stroke-width="1.5" opacity="0.55"/>
<polygon points="227.4,50 281.1,81 281.1,143 227.4,174 173.7,143 173.7,81" fill="none" stroke="currentColor" stroke-width="1.5" opacity="0.55"/>
<circle cx="126.7" cy="53.9" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="133.4" cy="57.8" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="140.1" cy="61.6" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="146.8" cy="65.5" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="153.6" cy="69.4" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="160.3" cy="73.2" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="167" cy="77.1" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="173.7" cy="88.8" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="173.7" cy="96.5" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="173.7" cy="104.2" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="173.7" cy="112" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="173.7" cy="119.8" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="173.7" cy="127.5" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="173.7" cy="135.2" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="167" cy="146.9" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="160.3" cy="150.8" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="153.6" cy="154.6" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="146.8" cy="158.5" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="140.1" cy="162.4" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="133.4" cy="166.2" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="126.7" cy="170.1" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="113.3" cy="170.1" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="106.6" cy="166.2" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="99.9" cy="162.4" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="93.2" cy="158.5" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="86.4" cy="154.6" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="79.7" cy="150.8" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="73" cy="146.9" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="66.3" cy="135.2" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="66.3" cy="127.5" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="66.3" cy="119.8" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="66.3" cy="112" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="66.3" cy="104.2" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="66.3" cy="96.5" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="66.3" cy="88.8" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="73" cy="77.1" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="79.7" cy="73.2" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="86.4" cy="69.4" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="93.2" cy="65.5" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="99.9" cy="61.6" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="106.6" cy="57.8" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="113.3" cy="53.9" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="234.1" cy="53.9" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="240.8" cy="57.8" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="247.5" cy="61.6" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="254.2" cy="65.5" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="260.9" cy="69.4" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="267.7" cy="73.2" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="274.4" cy="77.1" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="281.1" cy="88.8" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="281.1" cy="96.5" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="281.1" cy="104.2" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="281.1" cy="112" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="281.1" cy="119.8" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="281.1" cy="127.5" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="281.1" cy="135.2" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="274.4" cy="146.9" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="267.7" cy="150.8" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="260.9" cy="154.6" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="254.2" cy="158.5" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="247.5" cy="162.4" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="240.8" cy="166.2" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="234.1" cy="170.1" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="220.7" cy="170.1" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="214" cy="166.2" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="207.3" cy="162.4" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="200.5" cy="158.5" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="193.8" cy="154.6" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="187.1" cy="150.8" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="180.4" cy="146.9" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="173.7" cy="135.2" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="173.7" cy="127.5" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="173.7" cy="119.8" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="173.7" cy="112" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="173.7" cy="104.2" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="173.7" cy="96.5" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="173.7" cy="88.8" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="180.4" cy="77.1" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="187.1" cy="73.2" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="193.8" cy="69.4" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="200.5" cy="65.5" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="207.3" cy="61.6" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="214" cy="57.8" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="220.7" cy="53.9" r="1.4" fill="currentColor" opacity="0.35"/>
<circle cx="173.7" cy="88.8" r="2.6" fill="currentColor"/>
<circle cx="173.7" cy="96.5" r="2.6" fill="currentColor"/>
<circle cx="173.7" cy="104.2" r="2.6" fill="currentColor"/>
<circle cx="173.7" cy="112" r="2.6" fill="currentColor"/>
<circle cx="173.7" cy="119.8" r="2.6" fill="currentColor"/>
<circle cx="173.7" cy="127.5" r="2.6" fill="currentColor"/>
<circle cx="173.7" cy="135.2" r="2.6" fill="currentColor"/>
<path d="M99.9 61.6 C117.9 91.6 133.7 104.2 173.7 104.2 S244.2 108.5 254.2 158.5" fill="none" stroke="currentColor" stroke-width="3" stroke-linecap="round"/>
<circle cx="173.7" cy="104.2" r="6" fill="none" stroke="currentColor" stroke-width="1.5"/>
<text x="183.7" y="96.2" font-family="ui-monospace, monospace" font-size="11" fill="currentColor">one of 7 ports</text>
<text x="96" y="202" font-family="ui-monospace, monospace" font-size="11" fill="currentColor" opacity="0.8">pane A</text>
<text x="203.4" y="202" font-family="ui-monospace, monospace" font-size="11" fill="currentColor" opacity="0.8">pane B</text>
<text x="330" y="70" font-family="ui-monospace, monospace" font-size="11" fill="currentColor">a 60° turn moves</text><text x="330" y="86" font-family="ui-monospace, monospace" font-size="11" fill="currentColor">port (e, k) to (e+1, k)</text>
<text x="330" y="130" font-family="ui-monospace, monospace" font-size="11" fill="currentColor">A and B mate when</text><text x="330" y="146" font-family="ui-monospace, monospace" font-size="11" fill="currentColor">B shows (e+3, 6−k)</text>
<text x="330" y="190" font-family="ui-monospace, monospace" font-size="11" fill="currentColor" opacity="0.8">no loose ends anywhere</text><text x="330" y="206" font-family="ui-monospace, monospace" font-size="11" fill="currentColor" opacity="0.8">= the drawing, exactly</text>
</svg>
<figcaption>The mechanic. A line crossing a pane edge is snapped to one of seven ports. Rotating a pane 60° moves port (e, k) to (e+1, k), and neighbours mate when they face each other on the same port. When nothing is left dangling, the board is the original drawing.</figcaption>
</figure>

That mechanic is the filter every tradition had to pass. The game needs **lines**: continuous strokes that cross pane edges and have to meet. A tradition built from lines slots straight in. A tradition built from filled figures, with meaning in faces and scenes, can only be used as a picture cut into pieces, which is what a jigsaw is and what we were trying not to make.

## Three questions for every tradition

Each of the ten traditions on the board, plus mandala, got the same three questions, in this order:

1. **Does it have a line the mechanic can carry?** This is a design question, and the easiest to answer.
2. **Who owns it?** Is it a shared, living practice that anyone may take part in, or an authored style practised by particular artists and communities?
3. **Is it sacred in a way that scrambling would insult?** Cutting a picture into pieces and handing them to a stranger to reassemble is not a neutral act when the picture is of a god.

| Tradition | Region | Line? | Ownership | Sacred content | Where it landed |
|---|---|---|---|---|---|
| Kolam | Tamil Nadu | a single looped line, by definition | shared daily practice | auspicious, abstract | **In the game, generated** |
| Rangoli | across India | rings, petals, stars | shared festival practice | auspicious, mostly abstract | **In the game, generated** |
| Mandala *(not on the board)* | pan-Asian | circles and petals | geometry belongs to nobody | ritual mandalas and all yantras | **In the game, secular geometry only** |
| Gond | Madhya Pradesh | strong outlines, dot-and-dash fills | authored, GI-registered | nature and folk myth | Waiting for a commissioned artist |
| Madhubani (Mithila) | Bihar | bold double outlines | authored, GI-registered | often deities | Waiting for a commissioned artist, no deities |
| Warli | Maharashtra | circles, triangles, lines | community heritage, GI-registered | the marriage chauk is ritual | Waiting for a commissioned artist, no chauk |
| Kalamkari | Andhra Pradesh | flowing vines | authored, GI-registered | temple narrative cloths | Florals only, commissioned, if ever |
| Pattachitra | Odisha | dense figures | authored, GI-registered | centred on Jagannath | Not planned |
| Phad | Rajasthan | narrative panels | authored | portable shrines of folk deities | Not planned |
| Rajasthani miniature | Rajasthan | fine outlines | historical works, many public domain | varies by object | Public-domain museum art, object by object |
| Mughal floral | North India | vines and blossoms | historical works, many public domain | mostly decorative | Public-domain museum art, object by object |

Kolam answered all three questions most cleanly, and its own rules turned out to be the game's rules, so that is where to start.

## Kolam: the tradition that is already a puzzle

### What a kolam is

A kolam is drawn in rice flour on the threshold of a home, a shop or a temple. Tamil women draw them before dawn, letting pinches of flour run from between the thumb and first finger ([Sahapedia](http://www.sahapedia.org/significance-of-kolam-tamil-culture); [Nagarajan, OUP](https://repository.usfca.edu/faculty_books_all/39/)). Most begin as a grid of dots, the *pulli*. The line is then drawn around the dots, looping, encircling or joining them, but never touching one. The most prized kind is the *sikku* (knot) kolam, where a single stroke runs once around every dot and comes back to where it started, so that, in Sahapedia's words, "one can not figure out where the design begins… and where it ends." Slavik Jablan's survey of the geometry names the culturally ideal single-line design *pavitram*, or *Brahma-mudi* ([Jablan, Bridges 2001](https://archive.bridgesmathart.org/2001/bridges2001-233.pdf)).

A kolam is also food, and it is meant to disappear. The coarse flour is eaten by ants, birds and insects. In Vijaya Nagarajan's phrase, drawing it fulfils the duty of *feeding a thousand souls* ([Sahapedia, on Nagarajan's work](http://www.sahapedia.org/female-aesthetics-and-ecological-connect-kolam)). By afternoon it has been walked over, rained on and eaten, and tomorrow's is drawn fresh ([Wikipedia](https://en.wikipedia.org/wiki/Kolam)). In the month of Margazhi, from mid-December to mid-January ([Asia InCH](https://asiainch.org/craft/rangoli-kolam-threshold-arts-of-india/)), the kolams get bigger and the streets compete. Chennai's Mylapore Festival has held a kolam contest on North Mada Street since the late 1990s ([Mylapore Festival](https://mylaporefestival.in/2025/kolam_contest.html); [DT Next](https://www.dtnext.in/news/chennai/why-the-mylapore-festival-matters)).

Read that as a game designer and it is already a puzzle: *one line, no loose ends, around every dot, back to the start*. That is the same rule the ChitraYatra board enforces. When we surveyed Google Play in September, we found no rotate-to-solve kolam puzzle at all; the kolam apps were tracing tutorials and design catalogues.

### Kolam is a mirror curve

Mathematicians have been reading kolam for fifty years. In 1974, Gift Siromoney, R. Siromoney and Kamala Krithivasan at Madras Christian College used kolam to develop *array grammars*, formal languages for two-dimensional pictures ([Computer Graphics and Image Processing](https://doi.org/10.1016/0146-664X(74)90011-2)). Marcia Ascher gave the tradition a chapter in *Mathematics Elsewhere* and an [essay in American Scientist](https://www.americanscientist.org/article/the-kolam-tradition). Paulus Gerdes tied it to the *sona* sand drawings of the Chokwe in Angola ([Gerdes, 1989](https://doi.org/10.1016/0898-1221(89)90261-7)), and Jablan generalised both into **mirror curves**.

The construction is simple. Put a dot at the centre of every cell of an m×n grid. Start a ray at the midpoint of any cell edge and send it diagonally. It travels from edge midpoint to edge midpoint, reflects off the outer border like a billiard ball, and eventually comes back to where it started. That closed path, smoothed, is a kolam: it passes between every pair of neighbouring dots and loops around the outer ones.

The result that matters is about how many separate lines this draws. With no interior mirrors, **an m×n grid draws exactly gcd(m, n) closed curves**. Shojiro Nagata states it for kolam specifically ("the loop number of the lattice Kolam on a N × M dot array is GCD(N,M)") and credits Gerdes; the argument comes from how a billiard ball reflects off the edges of a table ([Nagata, Forma 2015](https://www.jstage.jst.go.jp/article/forma/30/1/30_9/_pdf/-char/en)). Jablan states it for mirror curves in general, and Darrah Chavey for sona ([Chavey, Bridges 2009](https://archive.bridgesmathart.org/2009/bridges2009-305.pdf)). So a coprime grid (3×4, 5×7) gives the prized single line, and a square grid bigger than 1×1 never does.

<figure>
<svg viewBox="0 6 170 100" role="img" aria-label="Two kolams drawn by the game's generator. On the left, a three by three dot grid produces three separate closed loops, drawn solid, faint and dashed. On the right, a three by four dot grid produces one single unbroken line." style="width:100%;height:auto">
<g transform="translate(-18 0)"><path d="M32 26.6L33.6 26.9L35.3 27.8L37.2 29.1L39.1 30.5L41 32L42.8 33.6L44.6 35.3L46.4 37.2L48.2 39.1L50 41L51.8 42.8L53.6 44.6L55.4 46.4L57.2 48.2L59 50L60.9 51.8L62.8 53.6L64.7 55.4L66.4 57.2L68 59L69.5 60.9L70.9 62.8L72.2 64.7L73.1 66.4L73.4 68L73.1 69.5L72.2 70.9L70.9 72.2L69.5 73.1L68 73.4L66.4 73.1L64.7 72.2L62.8 70.9L60.9 69.5L59 68L57.2 66.4L55.4 64.7L53.6 62.8L51.8 60.9L50 59L48.2 57.2L46.4 55.4L44.6 53.6L42.8 51.8L41 50L39.1 48.2L37.2 46.4L35.3 44.6L33.6 42.8L32 41L30.5 39.1L29.1 37.2L27.8 35.3L26.9 33.6L26.6 32L26.9 30.5L27.8 29.1L29.1 27.8L30.5 26.9L32 26.6Z" fill="none" stroke="currentColor" stroke-width="1.1" stroke-linejoin="round"/><path d="M50 26.6L51.8 26.9L53.6 27.8L55.4 29.1L57.2 30.5L59 32L60.9 33.6L62.8 35.3L64.7 37.2L66.4 39.1L68 41L69.5 42.8L70.9 44.6L72.2 46.4L73.1 48.2L73.4 50L73.1 51.8L72.2 53.6L70.9 55.4L69.5 57.2L68 59L66.4 60.9L64.7 62.8L62.8 64.7L60.9 66.4L59 68L57.2 69.5L55.4 70.9L53.6 72.2L51.8 73.1L50 73.4L48.2 73.1L46.4 72.2L44.6 70.9L42.8 69.5L41 68L39.1 66.4L37.2 64.7L35.3 62.8L33.6 60.9L32 59L30.5 57.2L29.1 55.4L27.8 53.6L26.9 51.8L26.6 50L26.9 48.2L27.8 46.4L29.1 44.6L30.5 42.8L32 41L33.6 39.1L35.3 37.2L37.2 35.3L39.1 33.6L41 32L42.8 30.5L44.6 29.1L46.4 27.8L48.2 26.9L50 26.6Z" fill="none" stroke="currentColor" stroke-width="1.1" stroke-linejoin="round" opacity="0.45"/><path d="M68 26.6L69.5 26.9L70.9 27.8L72.2 29.1L73.1 30.5L73.4 32L73.1 33.6L72.2 35.3L70.9 37.2L69.5 39.1L68 41L66.4 42.8L64.7 44.6L62.8 46.4L60.9 48.2L59 50L57.2 51.8L55.4 53.6L53.6 55.4L51.8 57.2L50 59L48.2 60.9L46.4 62.8L44.6 64.7L42.8 66.4L41 68L39.1 69.5L37.2 70.9L35.3 72.2L33.6 73.1L32 73.4L30.5 73.1L29.1 72.2L27.8 70.9L26.9 69.5L26.6 68L26.9 66.4L27.8 64.7L29.1 62.8L30.5 60.9L32 59L33.6 57.2L35.3 55.4L37.2 53.6L39.1 51.8L41 50L42.8 48.2L44.6 46.4L46.4 44.6L48.2 42.8L50 41L51.8 39.1L53.6 37.2L55.4 35.3L57.2 33.6L59 32L60.9 30.5L62.8 29.1L64.7 27.8L66.4 26.9L68 26.6Z" fill="none" stroke="currentColor" stroke-width="1.1" stroke-linejoin="round" stroke-dasharray="2.2 1.6"/><circle cx="32" cy="32" r="1.1" fill="currentColor"/><circle cx="50" cy="32" r="1.1" fill="currentColor"/><circle cx="68" cy="32" r="1.1" fill="currentColor"/><circle cx="32" cy="50" r="1.1" fill="currentColor"/><circle cx="50" cy="50" r="1.1" fill="currentColor"/><circle cx="68" cy="50" r="1.1" fill="currentColor"/><circle cx="32" cy="68" r="1.1" fill="currentColor"/><circle cx="50" cy="68" r="1.1" fill="currentColor"/><circle cx="68" cy="68" r="1.1" fill="currentColor"/></g><g transform="translate(82 0)"><path d="M32 17.6L33.6 17.9L35.3 18.8L37.2 20.1L39.1 21.5L41 23L42.8 24.6L44.6 26.3L46.4 28.2L48.2 30.1L50 32L51.8 33.8L53.6 35.6L55.4 37.4L57.2 39.2L59 41L60.9 42.8L62.8 44.6L64.7 46.4L66.4 48.2L68 50L69.5 51.8L70.9 53.6L72.2 55.4L73.1 57.2L73.4 59L73.1 60.8L72.2 62.6L70.9 64.4L69.5 66.2L68 68L66.4 69.9L64.7 71.8L62.8 73.7L60.9 75.4L59 77L57.2 78.5L55.4 79.9L53.6 81.2L51.8 82.1L50 82.4L48.2 82.1L46.4 81.2L44.6 79.9L42.8 78.5L41 77L39.1 75.4L37.2 73.7L35.3 71.8L33.6 69.9L32 68L30.5 66.2L29.1 64.4L27.8 62.6L26.9 60.8L26.6 59L26.9 57.2L27.8 55.4L29.1 53.6L30.5 51.8L32 50L33.6 48.2L35.3 46.4L37.2 44.6L39.1 42.8L41 41L42.8 39.2L44.6 37.4L46.4 35.6L48.2 33.8L50 32L51.8 30.1L53.6 28.2L55.4 26.3L57.2 24.6L59 23L60.9 21.5L62.8 20.1L64.7 18.8L66.4 17.9L68 17.6L69.5 17.9L70.9 18.8L72.2 20.1L73.1 21.5L73.4 23L73.1 24.6L72.2 26.3L70.9 28.2L69.5 30.1L68 32L66.4 33.8L64.7 35.6L62.8 37.4L60.9 39.2L59 41L57.2 42.8L55.4 44.6L53.6 46.4L51.8 48.2L50 50L48.2 51.8L46.4 53.6L44.6 55.4L42.8 57.2L41 59L39.1 60.8L37.2 62.6L35.3 64.4L33.6 66.2L32 68L30.5 69.9L29.1 71.8L27.8 73.7L26.9 75.4L26.6 77L26.9 78.5L27.8 79.9L29.1 81.2L30.5 82.1L32 82.4L33.6 82.1L35.3 81.2L37.2 79.9L39.1 78.5L41 77L42.8 75.4L44.6 73.7L46.4 71.8L48.2 69.9L50 68L51.8 66.2L53.6 64.4L55.4 62.6L57.2 60.8L59 59L60.9 57.2L62.8 55.4L64.7 53.6L66.4 51.8L68 50L69.5 48.2L70.9 46.4L72.2 44.6L73.1 42.8L73.4 41L73.1 39.2L72.2 37.4L70.9 35.6L69.5 33.8L68 32L66.4 30.1L64.7 28.2L62.8 26.3L60.9 24.6L59 23L57.2 21.5L55.4 20.1L53.6 18.8L51.8 17.9L50 17.6L48.2 17.9L46.4 18.8L44.6 20.1L42.8 21.5L41 23L39.1 24.6L37.2 26.3L35.3 28.2L33.6 30.1L32 32L30.5 33.8L29.1 35.6L27.8 37.4L26.9 39.2L26.6 41L26.9 42.8L27.8 44.6L29.1 46.4L30.5 48.2L32 50L33.6 51.8L35.3 53.6L37.2 55.4L39.1 57.2L41 59L42.8 60.8L44.6 62.6L46.4 64.4L48.2 66.2L50 68L51.8 69.9L53.6 71.8L55.4 73.7L57.2 75.4L59 77L60.9 78.5L62.8 79.9L64.7 81.2L66.4 82.1L68 82.4L69.5 82.1L70.9 81.2L72.2 79.9L73.1 78.5L73.4 77L73.1 75.4L72.2 73.7L70.9 71.8L69.5 69.9L68 68L66.4 66.2L64.7 64.4L62.8 62.6L60.9 60.8L59 59L57.2 57.2L55.4 55.4L53.6 53.6L51.8 51.8L50 50L48.2 48.2L46.4 46.4L44.6 44.6L42.8 42.8L41 41L39.1 39.2L37.2 37.4L35.3 35.6L33.6 33.8L32 32L30.5 30.1L29.1 28.2L27.8 26.3L26.9 24.6L26.6 23L26.9 21.5L27.8 20.1L29.1 18.8L30.5 17.9L32 17.6Z" fill="none" stroke="currentColor" stroke-width="1.1" stroke-linejoin="round"/><circle cx="32" cy="23" r="1.1" fill="currentColor"/><circle cx="50" cy="23" r="1.1" fill="currentColor"/><circle cx="68" cy="23" r="1.1" fill="currentColor"/><circle cx="32" cy="41" r="1.1" fill="currentColor"/><circle cx="50" cy="41" r="1.1" fill="currentColor"/><circle cx="68" cy="41" r="1.1" fill="currentColor"/><circle cx="32" cy="59" r="1.1" fill="currentColor"/><circle cx="50" cy="59" r="1.1" fill="currentColor"/><circle cx="68" cy="59" r="1.1" fill="currentColor"/><circle cx="32" cy="77" r="1.1" fill="currentColor"/><circle cx="50" cy="77" r="1.1" fill="currentColor"/><circle cx="68" cy="77" r="1.1" fill="currentColor"/></g>
<g fill="currentColor" font-family="ui-monospace, monospace" font-size="3.6" text-anchor="middle">
<text x="32" y="98">3 × 3 dots · gcd 3 · three lines</text>
<text x="132" y="98">3 × 4 dots · gcd 1 · one line</text>
</g>
</svg>
<figcaption>Drawn by the game's own generator, not by hand. On the left, three separate lines, one solid, one faint and one dashed. On the right, one line through all twelve dots: the Threshold window, the first kolam in the game.</figcaption>
</figure>

Our generator does not rely on the theorem. It walks the line and counts what it drew. Every diagonal hop between two edge midpoints belongs to exactly one line, so the walk marks each hop as it goes and starts a new line only from a hop nobody has walked yet:

```dart
for (var guard = 0; guard < 8 * (cols + 1) * (rows + 1); guard++) {
  loop.add(Vec2(x + ox, y + oy));
  walked.add(hop(x, y, x + dx, y + dy));
  x += dx;
  y += dy;
  ox = 0;
  oy = 0;
  if (_reflectsAt(x, y)) {           // the border, or an interior mirror
    if (x == x.roundToDouble()) {
      ox = -_bounce * dx.sign;       // pull the drawn point back 0.2 cells
      dx = -dx;
    } else {
      oy = -_bounce * dy.sign;
      dy = -dy;
    }
  }
  if (x == sx && y == sy && dx == sdx && dy == sdy) break;
}
```

Then I checked it against the theorem anyway. For every grid from 1×1 to 9×9, the number of lines the walker draws with no mirrors equals gcd(m, n): **81 of 81**. That is not a proof of anything the mathematicians did not already prove. It is a test that our code draws what the literature says it should, and the point of [measuring a generator rather than trusting it](/lab/puzzle-generator-random-walk-doesnt-work) is that the day it disagrees, you find out.

### Mirrors, and where the line turns away

A kolam with no interior mirrors is a plain diagonal lattice, which is pleasant but not what a threshold looks like on a festival morning. Real sikku kolams double back on themselves. In mirror-curve terms, you place **mirrors** on some of the interior edges between dots, the ray reflects off those too, and the pattern becomes a knot.

Our first mirrored kolams looked exactly like the unmirrored ones. When a line reflects off an interior mirror, the two strands meeting from either side both pass through the mirror's midpoint, so on screen they read as a crossing, and every mirrored kolam collapsed back into the plain lattice. The fix is the `_bounce` in the code above: wherever the line reflects, the drawn point is pulled **0.2 cells back** toward the side it came from. The strands now turn away from each other instead of meeting in an X, which is also how a hand draws the turn around a dot.

Mirrors come at a price. Most mirror sets break the single line into several. The level author's tool, `tool/kolam_presets.dart`, samples mirror sets, keeps only those whose walk still returns one line, and prints them ready to paste into the level file.

### Symmetry, and the pinwheel problem

Real kolams are symmetric, so the preset tool doesn't sample mirrors one at a time. It samples them in **symmetric orbits**: pick one interior edge, and the tool adds its reflection across the vertical axis, the horizontal axis and both, plus the diagonals on a square grid. The first version sampled rotations instead, turning each mirror 90° about the centre, which is a perfectly good symmetry and one many real kolams have. The comment in the tool records what happened:

```dart
// Mirror symmetry, not rotation alone. Rotation-only (C4) sets make
// pinwheels, and a four-armed pinwheel reads as a swastika — an old
// auspicious motif, and not one to put in front of the world without
// context. Reflections across both axes (and the diagonals on a square
// grid) give the balanced, achiral patterns that are also the commonest on
// real thresholds.
```

The swastika is sacred in Hinduism, Buddhism and Jainism, from the Sanskrit for well-being, and it is still a common sight on temples and houses in India ([USHMM](https://encyclopedia.ushmm.org/content/en/article/history-of-the-swastika)). It appears in rangoli at Diwali. It is also a symbol that a player in Europe or the US will read one way only, and that misreading has real consequences: in 2019 an Indian family in Adelaide had a Diwali rangoli destroyed by a delivery driver because it contained one ([ABC Religion & Ethics](https://www.abc.net.au/religion/the-swastika-and-the-problem-of-cultural-appropriation/11811518)). A game shipped worldwide cannot add the context a neighbour would. So the tool now samples mirror symmetry only.

For this post I measured how much that constraint costs, running 4,000 random mirror sets per grid through the same generator the game uses:

| Grid | Interior mirror sites | Random mirror sets that keep one line | Mirror-symmetric sets that keep one line |
|---|---|---|---|
| 3×5 | 22 | 609 / 4,000 | 612 / 4,000 (7 distinct) |
| 3×7 | 32 | 375 / 4,000 | 452 / 4,000 (23 distinct) |
| 5×7 | 58 | 232 / 4,000 | 383 / 4,000 (184 distinct) |
| 5×5, 7×7 | 40, 84 | — | **0 / 8,000** with eightfold symmetry |
| 4×4, 6×6 | 24, 60 | — | **0 / 8,000**, even with only the two axes |

Two things came out of that table that I did not expect.

**On a rectangle, symmetry helps rather than hurts.** A symmetric mirror set is more likely to keep the line whole than a random one, and on 5×7 it is 1.65 times as likely. On 3×5 the symmetric search is small, though: only seven distinct sets exist.

**On a square, it is the other way round.** Full eightfold symmetry, meaning both axes plus both diagonals, never produced a single line in 16,000 samples across four square grids. Even-sized squares failed with only the two axes. I then ran the rejected rotation-only sampler on 5×5 and 7×7. It found 289 distinct single-line kolams, and **all 289 were chiral**: none had a mirror line. On a square grid, as far as this sampler can see, the only way to get one line with fourfold symmetry is a pinwheel.

I don't have a proof of that, and I would like one. V. Gopalan's 2024 [symmetry classification of square-tile sikku kolams](https://doi.org/10.1080/17513472.2024.2423568) is where I would look first; I have not yet checked these counts against it. In practice, every mirrored kolam in the game is drawn on an **odd-by-odd rectangle**: 3×5, 3×7 and 5×7.

### The Threshold collection

<figure>
<svg viewBox="18 7 64 86" role="img" aria-label="A single-line sikku kolam on a five by seven grid of thirty-five dots. The line loops around every dot, doubling back at twenty-four interior mirrors, and forms one closed curve with mirror symmetry across both axes." style="width:100%;max-width:360px;height:auto;display:block;margin:0 auto">
<g transform="translate(0 0)"><path d="M27.7 13.2L28.7 13.5L29.8 14.1L31 14.9L32.1 15.8L33.3 16.6L34.4 17.4L35.5 18.2L36.6 19.1L37.7 19.7L38.9 19.9L40 19.7L41.1 19.1L42.2 18.2L43.3 17.4L44.4 16.6L45.5 15.8L46.7 14.9L47.8 14.1L48.9 13.5L50 13.2L51.1 13.5L52.2 14.1L53.3 14.9L54.5 15.8L55.6 16.6L56.7 17.4L57.8 18.2L58.9 19.1L60 19.7L61.1 19.9L62.3 19.7L63.4 19.1L64.5 18.2L65.6 17.4L66.7 16.6L67.9 15.8L69 14.9L70.2 14.1L71.3 13.5L72.3 13.2L73.2 13.4L74.1 14L74.9 14.8L75.4 15.7L75.6 16.6L75.4 17.6L74.9 18.6L74.1 19.8L73.2 21L72.3 22.1L71.3 23.3L70.2 24.5L69 25.7L67.9 26.7L66.7 27.7L65.6 28.6L64.4 29.5L63.2 30.3L62.1 30.9L61.1 31.1L60.2 30.8L59.3 30.2L58.5 29.4L58 28.5L57.8 27.7L58 26.9L58.5 26.1L59.3 25.2L60.2 24.6L61.1 24.4L62.1 24.6L63.2 25.2L64.4 26.1L65.6 26.9L66.7 27.7L67.9 28.5L69 29.4L70.2 30.2L71.3 30.8L72.3 31.1L73.2 30.9L74.1 30.3L74.9 29.5L75.4 28.6L75.6 27.7L75.4 26.7L74.9 25.7L74.1 24.5L73.2 23.3L72.3 22.1L71.3 21L70.2 19.8L69 18.6L67.9 17.6L66.7 16.6L65.6 15.7L64.5 14.8L63.4 14L62.3 13.4L61.1 13.2L60 13.4L58.9 14L57.8 14.8L56.7 15.7L55.6 16.6L54.4 17.6L53.2 18.6L52.1 19.8L51 21L50 22.1L49.1 23.3L48.2 24.4L47.4 25.5L46.9 26.6L46.7 27.7L46.9 28.8L47.5 29.9L48.3 31.1L49.2 32.2L50 33.3L50.8 34.4L51.7 35.5L52.5 36.6L53.1 37.7L53.3 38.9L53.1 40L52.6 41.1L51.8 42.2L50.9 43.3L50 44.4L49 45.5L47.9 46.7L46.8 47.8L45.6 48.9L44.4 50L43.3 51.1L42.2 52.2L41.1 53.3L40 54.5L38.9 55.6L37.7 56.7L36.6 57.9L35.5 59.1L34.4 60.2L33.3 61.1L32.1 62.1L31 63L29.8 63.7L28.7 64.3L27.7 64.5L26.8 64.2L25.9 63.6L25.1 62.8L24.6 61.9L24.4 61.1L24.6 60.4L25.1 59.5L25.9 58.7L26.8 58L27.7 57.8L28.7 58L29.8 58.7L31 59.5L32.1 60.4L33.3 61.1L34.4 61.9L35.6 62.8L36.8 63.6L37.9 64.2L38.9 64.5L39.8 64.3L40.7 63.7L41.5 63L42 62.1L42.2 61.1L42 60.2L41.5 59.1L40.7 57.9L39.8 56.7L38.9 55.6L37.9 54.4L36.8 53.2L35.6 52.1L34.4 51L33.3 50L32.1 49.1L31 48.2L29.8 47.4L28.7 46.9L27.7 46.7L26.8 46.9L25.9 47.5L25.1 48.3L24.6 49.2L24.4 50L24.6 50.8L25.1 51.7L25.9 52.5L26.8 53.1L27.7 53.3L28.7 53.1L29.8 52.6L31 51.8L32.1 50.9L33.3 50L34.4 49L35.6 47.9L36.8 46.8L37.9 45.6L38.9 44.4L39.8 43.3L40.7 42.1L41.5 40.9L42 39.8L42.2 38.9L42 37.9L41.5 37L40.7 36.3L39.8 35.7L38.9 35.5L37.9 35.8L36.8 36.4L35.6 37.2L34.4 38.1L33.3 38.9L32.1 39.6L31 40.5L29.8 41.3L28.7 42L27.7 42.2L26.8 42L25.9 41.3L25.1 40.5L24.6 39.6L24.4 38.9L24.6 38.1L25.1 37.2L25.9 36.4L26.8 35.8L27.7 35.5L28.7 35.7L29.8 36.3L31 37L32.1 37.9L33.3 38.9L34.4 39.8L35.5 40.9L36.6 42.1L37.7 43.3L38.9 44.4L40 45.5L41.1 46.7L42.2 47.8L43.3 48.9L44.4 50L45.6 51.1L46.8 52.2L47.9 53.3L49 54.5L50 55.6L50.9 56.7L51.8 57.8L52.6 58.9L53.1 60L53.3 61.1L53.1 62.3L52.5 63.4L51.7 64.5L50.8 65.6L50 66.7L49.2 67.8L48.3 68.9L47.5 70.1L46.9 71.2L46.7 72.3L46.9 73.4L47.4 74.5L48.2 75.6L49.1 76.7L50 77.8L51 79L52.1 80.2L53.2 81.4L54.4 82.4L55.6 83.4L56.7 84.3L57.8 85.2L58.9 86L60 86.6L61.1 86.8L62.3 86.6L63.4 86L64.5 85.2L65.6 84.3L66.7 83.4L67.9 82.4L69 81.4L70.2 80.2L71.3 79L72.3 77.8L73.2 76.7L74.1 75.5L74.9 74.3L75.4 73.3L75.6 72.3L75.4 71.4L74.9 70.5L74.1 69.7L73.2 69.1L72.3 68.9L71.3 69.2L70.2 69.8L69 70.6L67.9 71.5L66.7 72.3L65.6 73.1L64.4 73.9L63.2 74.8L62.1 75.4L61.1 75.6L60.2 75.4L59.3 74.8L58.5 73.9L58 73.1L57.8 72.3L58 71.5L58.5 70.6L59.3 69.8L60.2 69.2L61.1 68.9L62.1 69.1L63.2 69.7L64.4 70.5L65.6 71.4L66.7 72.3L67.9 73.3L69 74.3L70.2 75.5L71.3 76.7L72.3 77.8L73.2 79L74.1 80.2L74.9 81.4L75.4 82.4L75.6 83.4L75.4 84.3L74.9 85.2L74.1 86L73.2 86.6L72.3 86.8L71.3 86.5L70.2 85.9L69 85.1L67.9 84.2L66.7 83.4L65.6 82.6L64.5 81.8L63.4 80.9L62.3 80.3L61.1 80.1L60 80.3L58.9 80.9L57.8 81.8L56.7 82.6L55.6 83.4L54.5 84.2L53.3 85.1L52.2 85.9L51.1 86.5L50 86.8L48.9 86.5L47.8 85.9L46.7 85.1L45.5 84.2L44.4 83.4L43.3 82.6L42.2 81.8L41.1 80.9L40 80.3L38.9 80.1L37.7 80.3L36.6 80.9L35.5 81.8L34.4 82.6L33.3 83.4L32.1 84.2L31 85.1L29.8 85.9L28.7 86.5L27.7 86.8L26.8 86.6L25.9 86L25.1 85.2L24.6 84.3L24.4 83.4L24.6 82.4L25.1 81.4L25.9 80.2L26.8 79L27.7 77.8L28.7 76.7L29.8 75.5L31 74.3L32.1 73.3L33.3 72.3L34.4 71.4L35.6 70.5L36.8 69.7L37.9 69.1L38.9 68.9L39.8 69.2L40.7 69.8L41.5 70.6L42 71.5L42.2 72.3L42 73.1L41.5 73.9L40.7 74.8L39.8 75.4L38.9 75.6L37.9 75.4L36.8 74.8L35.6 73.9L34.4 73.1L33.3 72.3L32.1 71.5L31 70.6L29.8 69.8L28.7 69.2L27.7 68.9L26.8 69.1L25.9 69.7L25.1 70.5L24.6 71.4L24.4 72.3L24.6 73.3L25.1 74.3L25.9 75.5L26.8 76.7L27.7 77.8L28.7 79L29.8 80.2L31 81.4L32.1 82.4L33.3 83.4L34.4 84.3L35.5 85.2L36.6 86L37.7 86.6L38.9 86.8L40 86.6L41.1 86L42.2 85.2L43.3 84.3L44.4 83.4L45.6 82.4L46.8 81.4L47.9 80.2L49 79L50 77.8L50.9 76.7L51.8 75.6L52.6 74.5L53.1 73.4L53.3 72.3L53.1 71.2L52.5 70.1L51.7 68.9L50.8 67.8L50 66.7L49.2 65.6L48.3 64.5L47.5 63.4L46.9 62.3L46.7 61.1L46.9 60L47.4 58.9L48.2 57.8L49.1 56.7L50 55.6L51 54.5L52.1 53.3L53.2 52.2L54.4 51.1L55.6 50L56.7 48.9L57.8 47.8L58.9 46.7L60 45.5L61.1 44.4L62.3 43.3L63.4 42.1L64.5 40.9L65.6 39.8L66.7 38.9L67.9 37.9L69 37L70.2 36.3L71.3 35.7L72.3 35.5L73.2 35.8L74.1 36.4L74.9 37.2L75.4 38.1L75.6 38.9L75.4 39.6L74.9 40.5L74.1 41.3L73.2 42L72.3 42.2L71.3 42L70.2 41.3L69 40.5L67.9 39.6L66.7 38.9L65.6 38.1L64.4 37.2L63.2 36.4L62.1 35.8L61.1 35.5L60.2 35.7L59.3 36.3L58.5 37L58 37.9L57.8 38.9L58 39.8L58.5 40.9L59.3 42.1L60.2 43.3L61.1 44.4L62.1 45.6L63.2 46.8L64.4 47.9L65.6 49L66.7 50L67.9 50.9L69 51.8L70.2 52.6L71.3 53.1L72.3 53.3L73.2 53.1L74.1 52.5L74.9 51.7L75.4 50.8L75.6 50L75.4 49.2L74.9 48.3L74.1 47.5L73.2 46.9L72.3 46.7L71.3 46.9L70.2 47.4L69 48.2L67.9 49.1L66.7 50L65.6 51L64.4 52.1L63.2 53.2L62.1 54.4L61.1 55.6L60.2 56.7L59.3 57.9L58.5 59.1L58 60.2L57.8 61.1L58 62.1L58.5 63L59.3 63.7L60.2 64.3L61.1 64.5L62.1 64.2L63.2 63.6L64.4 62.8L65.6 61.9L66.7 61.1L67.9 60.4L69 59.5L70.2 58.7L71.3 58L72.3 57.8L73.2 58L74.1 58.7L74.9 59.5L75.4 60.4L75.6 61.1L75.4 61.9L74.9 62.8L74.1 63.6L73.2 64.2L72.3 64.5L71.3 64.3L70.2 63.7L69 63L67.9 62.1L66.7 61.1L65.6 60.2L64.5 59.1L63.4 57.9L62.3 56.7L61.1 55.6L60 54.5L58.9 53.3L57.8 52.2L56.7 51.1L55.6 50L54.4 48.9L53.2 47.8L52.1 46.7L51 45.5L50 44.4L49.1 43.3L48.2 42.2L47.4 41.1L46.9 40L46.7 38.9L46.9 37.7L47.5 36.6L48.3 35.5L49.2 34.4L50 33.3L50.8 32.2L51.7 31.1L52.5 29.9L53.1 28.8L53.3 27.7L53.1 26.6L52.6 25.5L51.8 24.4L50.9 23.3L50 22.1L49 21L47.9 19.8L46.8 18.6L45.6 17.6L44.4 16.6L43.3 15.7L42.2 14.8L41.1 14L40 13.4L38.9 13.2L37.7 13.4L36.6 14L35.5 14.8L34.4 15.7L33.3 16.6L32.1 17.6L31 18.6L29.8 19.8L28.7 21L27.7 22.1L26.8 23.3L25.9 24.5L25.1 25.7L24.6 26.7L24.4 27.7L24.6 28.6L25.1 29.5L25.9 30.3L26.8 30.9L27.7 31.1L28.7 30.8L29.8 30.2L31 29.4L32.1 28.5L33.3 27.7L34.4 26.9L35.6 26.1L36.8 25.2L37.9 24.6L38.9 24.4L39.8 24.6L40.7 25.2L41.5 26.1L42 26.9L42.2 27.7L42 28.5L41.5 29.4L40.7 30.2L39.8 30.8L38.9 31.1L37.9 30.9L36.8 30.3L35.6 29.5L34.4 28.6L33.3 27.7L32.1 26.7L31 25.7L29.8 24.5L28.7 23.3L27.7 22.1L26.8 21L25.9 19.8L25.1 18.6L24.6 17.6L24.4 16.6L24.6 15.7L25.1 14.8L25.9 14L26.8 13.4L27.7 13.2Z" fill="none" stroke="currentColor" stroke-width="0.9" stroke-linejoin="round"/><circle cx="27.7" cy="16.6" r="0.9" fill="currentColor"/><circle cx="38.9" cy="16.6" r="0.9" fill="currentColor"/><circle cx="50" cy="16.6" r="0.9" fill="currentColor"/><circle cx="61.1" cy="16.6" r="0.9" fill="currentColor"/><circle cx="72.3" cy="16.6" r="0.9" fill="currentColor"/><circle cx="27.7" cy="27.7" r="0.9" fill="currentColor"/><circle cx="38.9" cy="27.7" r="0.9" fill="currentColor"/><circle cx="50" cy="27.7" r="0.9" fill="currentColor"/><circle cx="61.1" cy="27.7" r="0.9" fill="currentColor"/><circle cx="72.3" cy="27.7" r="0.9" fill="currentColor"/><circle cx="27.7" cy="38.9" r="0.9" fill="currentColor"/><circle cx="38.9" cy="38.9" r="0.9" fill="currentColor"/><circle cx="50" cy="38.9" r="0.9" fill="currentColor"/><circle cx="61.1" cy="38.9" r="0.9" fill="currentColor"/><circle cx="72.3" cy="38.9" r="0.9" fill="currentColor"/><circle cx="27.7" cy="50" r="0.9" fill="currentColor"/><circle cx="38.9" cy="50" r="0.9" fill="currentColor"/><circle cx="50" cy="50" r="0.9" fill="currentColor"/><circle cx="61.1" cy="50" r="0.9" fill="currentColor"/><circle cx="72.3" cy="50" r="0.9" fill="currentColor"/><circle cx="27.7" cy="61.1" r="0.9" fill="currentColor"/><circle cx="38.9" cy="61.1" r="0.9" fill="currentColor"/><circle cx="50" cy="61.1" r="0.9" fill="currentColor"/><circle cx="61.1" cy="61.1" r="0.9" fill="currentColor"/><circle cx="72.3" cy="61.1" r="0.9" fill="currentColor"/><circle cx="27.7" cy="72.3" r="0.9" fill="currentColor"/><circle cx="38.9" cy="72.3" r="0.9" fill="currentColor"/><circle cx="50" cy="72.3" r="0.9" fill="currentColor"/><circle cx="61.1" cy="72.3" r="0.9" fill="currentColor"/><circle cx="72.3" cy="72.3" r="0.9" fill="currentColor"/><circle cx="27.7" cy="83.4" r="0.9" fill="currentColor"/><circle cx="38.9" cy="83.4" r="0.9" fill="currentColor"/><circle cx="50" cy="83.4" r="0.9" fill="currentColor"/><circle cx="61.1" cy="83.4" r="0.9" fill="currentColor"/><circle cx="72.3" cy="83.4" r="0.9" fill="currentColor"/></g>
</svg>
<figcaption>Lotus Sikku: 35 dots, 24 mirrors, one line. Symmetric across both axes, and by construction not a pinwheel. In the game it is cut into 23 panes, lights as 35 regions of glass, and is solved by turning rings of seven panes.</figcaption>
</figure>

Six kolams make up the Threshold collection. They are painted in a separate **dawn** theme: stone, rice-flour chalk, turmeric and vermilion, instead of the paper and stained glass of the rest of the game.

| Window | Dots | Mirrors | Lines | Panes | Glass regions | Played by |
|---|---|---|---|---|---|---|
| Threshold | 3×4 = 12 | 0 | 1 | 22 | 18 | rotating |
| Padi Kolam | 4×5 = 20 | 0 | 1 | 22 | 32 | rotating |
| Little Sikku | 3×5 = 15 | 8 | 1 | 22 | 15 | rotating |
| Veranda | 3×7 = 21 | 12 | 1 | 22 | 21 | swapping |
| Lotus Sikku | 5×7 = 35 | 24 | 1 | 23 | 35 | turning rings |
| Festival Threshold | 5×7 = 35 | 16 | 1 | 23 | 43 | rotating |

Each window carries a short card that names the practice, the place and how it is done. Veranda's reads: *"Narrow thresholds get long kolams — a column of dots down the step, the line running the whole length and back."* Padi Kolam's is the one I would keep if I could keep only one: *"A kolam is not meant to last. Feet, rain and the ants it feeds take it by afternoon, and tomorrow's is drawn fresh."*

Kolams repeat their tiles, which caused a problem for the swap and tray mechanics. Two panes from different parts of a kolam can look identical, so "is this pane in its home slot?" is the wrong question. A board could look finished and still refuse to light. For kolam, "correct" means *looks like* the slot's own pane at some rotation: the same ports, the same dots, and a drawn difference under 6% of a pane's size. The tradition's regularity, which makes kolam easy to generate, is exactly what made it hard to score.

## Rangoli: colour on the floor, under many names

Rangoli, from the Sanskrit *rangavalli*, is floor art made for festivals and ceremonies: Diwali above all, but also Pongal, Onam and Ugadi. It is laid in rice flour, powdered limestone, coloured sand or flower petals ([Wikipedia](https://en.wikipedia.org/wiki/Rangoli)). The tradition is so widespread that it has no single name. The design school at IIT Bombay lists *alpana* in West Bengal, *aripan* in Bihar, *aipan* in Uttarakhand, *jhoti* or *chita* in Odisha, *kolam* in Tamil Nadu, *muggu* in Andhra Pradesh, *mandana* in Rajasthan, *chowkpurana* in Uttar Pradesh, and *rangoli* in Gujarat, Karnataka and Maharashtra ([D'source, IIT Bombay](https://www.dsource.in/resource/rangoli/types-rangolis)). Kolam, on that list, is one regional member of a much larger family. It gets its own collection in the game because its single-line rule suits the mechanic so well.

The rangoli the game draws is the geometric core of the tradition: rings around a centre, in *n*-fold symmetry. One generator, `lib/engine/glass/ornament.dart`, has five ring kinds: circles, petals, star points, overlapping arcs (whose overlaps make the lens shapes floor ornament is built from) and scalloped edges. Every closed shape it draws becomes a coloured facet. A whole window is a short JSON spec. This is the Pookalam:

```json
{
  "folds": 16,
  "palette": ["#F5A623", "#D7263D", "#C2185B", "#43A047", "#00A6A6", "#F9C80E"],
  "rings": [
    {"kind": "circle", "r2": 7},
    {"kind": "circle", "r2": 14},
    {"kind": "petals", "r1": 14, "r2": 26, "width": 0.9, "alternate": true},
    {"kind": "circle", "r2": 28},
    {"kind": "petals", "r1": 28, "r2": 40, "shift": 0.5, "width": 0.8},
    {"kind": "circle", "r2": 41}
  ]
}
```

The palette is marigold, vermilion, magenta, parrot green, turquoise and turmeric: the colours of the powder, not of a design system. `shift: 0.5` rotates a ring by half a fold, so its petals sit between the ones inside. That single trick produces most of the "bloom" in real floor ornament.

<figure>
<svg viewBox="7 7 86 86" role="img" aria-label="A generated pookalam: a sixteen-fold flower of two rings of petals, the outer ring offset by half a petal, inside concentric circles." style="width:100%;max-width:380px;height:auto;display:block;margin:0 auto">
<path d="M48.6 36.1L48.1 35.3L47.5 34.2L46.9 32.9L46.5 31.6L46.5 30.3L46.8 28.9L47.5 27.2L48.3 25.6L49.2 24.5L50 24L50.8 24.5L51.7 25.6L52.5 27.2L53.2 28.9L53.5 30.3L53.5 31.6L53.1 32.9L52.5 34.2L51.9 35.3L51.4 36.1L50.8 36.5L50.3 36.8L49.7 36.8L49.2 36.5L48.6 36.1Z" fill="currentColor" fill-opacity="0.3"/><path d="M54.1 36.6L53.9 35.7L53.7 34.4L53.7 33L53.9 31.7L54.3 30.5L55.1 29.3L56.4 28L57.8 26.9L59 26.1L59.9 26L60.5 26.7L60.9 28.1L61 29.9L61 31.7L60.8 33.2L60.2 34.3L59.4 35.4L58.4 36.4L57.4 37.1L56.6 37.6L55.9 37.9L55.3 37.9L54.8 37.7L54.4 37.2L54.1 36.6Z" fill="currentColor" fill-opacity="0.12"/><path d="M58.9 39.2L59 38.2L59.4 37L59.9 35.7L60.6 34.5L61.4 33.6L62.7 32.8L64.3 32.1L66 31.6L67.5 31.4L68.4 31.6L68.6 32.5L68.4 34L67.9 35.7L67.2 37.3L66.4 38.6L65.5 39.4L64.3 40.1L63 40.6L61.8 41L60.8 41.1L60.1 41.1L59.6 40.8L59.2 40.4L58.9 39.9L58.9 39.2Z" fill="currentColor" fill-opacity="0.3"/><path d="M62.4 43.4L62.9 42.6L63.6 41.6L64.6 40.6L65.7 39.8L66.8 39.2L68.3 39L70.1 39L71.9 39.1L73.3 39.5L74 40.1L73.9 41L73.1 42.2L72 43.6L70.7 44.9L69.5 45.7L68.3 46.1L67 46.3L65.6 46.3L64.3 46.1L63.4 45.9L62.8 45.6L62.3 45.2L62.1 44.7L62.1 44.1L62.4 43.4Z" fill="currentColor" fill-opacity="0.12"/><path d="M63.9 48.6L64.7 48.1L65.8 47.5L67.1 46.9L68.4 46.5L69.7 46.5L71.1 46.8L72.8 47.5L74.4 48.3L75.5 49.2L76 50L75.5 50.8L74.4 51.7L72.8 52.5L71.1 53.2L69.7 53.5L68.4 53.5L67.1 53.1L65.8 52.5L64.7 51.9L63.9 51.4L63.5 50.8L63.2 50.3L63.2 49.7L63.5 49.2L63.9 48.6Z" fill="currentColor" fill-opacity="0.3"/><path d="M63.4 54.1L64.3 53.9L65.6 53.7L67 53.7L68.3 53.9L69.5 54.3L70.7 55.1L72 56.4L73.1 57.8L73.9 59L74 59.9L73.3 60.5L71.9 60.9L70.1 61L68.3 61L66.8 60.8L65.7 60.2L64.6 59.4L63.6 58.4L62.9 57.4L62.4 56.6L62.1 55.9L62.1 55.3L62.3 54.8L62.8 54.4L63.4 54.1Z" fill="currentColor" fill-opacity="0.12"/><path d="M60.8 58.9L61.8 59L63 59.4L64.3 59.9L65.5 60.6L66.4 61.4L67.2 62.7L67.9 64.3L68.4 66L68.6 67.5L68.4 68.4L67.5 68.6L66 68.4L64.3 67.9L62.7 67.2L61.4 66.4L60.6 65.5L59.9 64.3L59.4 63L59 61.8L58.9 60.8L58.9 60.1L59.2 59.6L59.6 59.2L60.1 58.9L60.8 58.9Z" fill="currentColor" fill-opacity="0.3"/><path d="M56.6 62.4L57.4 62.9L58.4 63.6L59.4 64.6L60.2 65.7L60.8 66.8L61 68.3L61 70.1L60.9 71.9L60.5 73.3L59.9 74L59 73.9L57.8 73.1L56.4 72L55.1 70.7L54.3 69.5L53.9 68.3L53.7 67L53.7 65.6L53.9 64.3L54.1 63.4L54.4 62.8L54.8 62.3L55.3 62.1L55.9 62.1L56.6 62.4Z" fill="currentColor" fill-opacity="0.12"/><path d="M51.4 63.9L51.9 64.7L52.5 65.8L53.1 67.1L53.5 68.4L53.5 69.7L53.2 71.1L52.5 72.8L51.7 74.4L50.8 75.5L50 76L49.2 75.5L48.3 74.4L47.5 72.8L46.8 71.1L46.5 69.7L46.5 68.4L46.9 67.1L47.5 65.8L48.1 64.7L48.6 63.9L49.2 63.5L49.7 63.2L50.3 63.2L50.8 63.5L51.4 63.9Z" fill="currentColor" fill-opacity="0.3"/><path d="M45.9 63.4L46.1 64.3L46.3 65.6L46.3 67L46.1 68.3L45.7 69.5L44.9 70.7L43.6 72L42.2 73.1L41 73.9L40.1 74L39.5 73.3L39.1 71.9L39 70.1L39 68.3L39.2 66.8L39.8 65.7L40.6 64.6L41.6 63.6L42.6 62.9L43.4 62.4L44.1 62.1L44.7 62.1L45.2 62.3L45.6 62.8L45.9 63.4Z" fill="currentColor" fill-opacity="0.12"/><path d="M41.1 60.8L41 61.8L40.6 63L40.1 64.3L39.4 65.5L38.6 66.4L37.3 67.2L35.7 67.9L34 68.4L32.5 68.6L31.6 68.4L31.4 67.5L31.6 66L32.1 64.3L32.8 62.7L33.6 61.4L34.5 60.6L35.7 59.9L37 59.4L38.2 59L39.2 58.9L39.9 58.9L40.4 59.2L40.8 59.6L41.1 60.1L41.1 60.8Z" fill="currentColor" fill-opacity="0.3"/><path d="M37.6 56.6L37.1 57.4L36.4 58.4L35.4 59.4L34.3 60.2L33.2 60.8L31.7 61L29.9 61L28.1 60.9L26.7 60.5L26 59.9L26.1 59L26.9 57.8L28 56.4L29.3 55.1L30.5 54.3L31.7 53.9L33 53.7L34.4 53.7L35.7 53.9L36.6 54.1L37.2 54.4L37.7 54.8L37.9 55.3L37.9 55.9L37.6 56.6Z" fill="currentColor" fill-opacity="0.12"/><path d="M36.1 51.4L35.3 51.9L34.2 52.5L32.9 53.1L31.6 53.5L30.3 53.5L28.9 53.2L27.2 52.5L25.6 51.7L24.5 50.8L24 50L24.5 49.2L25.6 48.3L27.2 47.5L28.9 46.8L30.3 46.5L31.6 46.5L32.9 46.9L34.2 47.5L35.3 48.1L36.1 48.6L36.5 49.2L36.8 49.7L36.8 50.3L36.5 50.8L36.1 51.4Z" fill="currentColor" fill-opacity="0.3"/><path d="M36.6 45.9L35.7 46.1L34.4 46.3L33 46.3L31.7 46.1L30.5 45.7L29.3 44.9L28 43.6L26.9 42.2L26.1 41L26 40.1L26.7 39.5L28.1 39.1L29.9 39L31.7 39L33.2 39.2L34.3 39.8L35.4 40.6L36.4 41.6L37.1 42.6L37.6 43.4L37.9 44.1L37.9 44.7L37.7 45.2L37.2 45.6L36.6 45.9Z" fill="currentColor" fill-opacity="0.12"/><path d="M39.2 41.1L38.2 41L37 40.6L35.7 40.1L34.5 39.4L33.6 38.6L32.8 37.3L32.1 35.7L31.6 34L31.4 32.5L31.6 31.6L32.5 31.4L34 31.6L35.7 32.1L37.3 32.8L38.6 33.6L39.4 34.5L40.1 35.7L40.6 37L41 38.2L41.1 39.2L41.1 39.9L40.8 40.4L40.4 40.8L39.9 41.1L39.2 41.1Z" fill="currentColor" fill-opacity="0.3"/><path d="M43.4 37.6L42.6 37.1L41.6 36.4L40.6 35.4L39.8 34.3L39.2 33.2L39 31.7L39 29.9L39.1 28.1L39.5 26.7L40.1 26L41 26.1L42.2 26.9L43.6 28L44.9 29.3L45.7 30.5L46.1 31.7L46.3 33L46.3 34.4L46.1 35.7L45.9 36.6L45.6 37.2L45.2 37.7L44.7 37.9L44.1 37.9L43.4 37.6Z" fill="currentColor" fill-opacity="0.12"/><path d="M53.1 22.2L52.4 21.3L51.8 20L51.3 18.7L51.1 17.3L51.3 16L52.1 14.7L53.5 13.3L55 11.9L56.5 11L57.8 10.8L58.9 11.5L59.9 12.9L60.9 14.7L61.5 16.6L61.8 18.1L61.5 19.3L60.8 20.6L59.8 21.6L58.8 22.5L57.8 23.1L56.9 23.4L55.8 23.4L54.8 23.2L53.8 22.8L53.1 22.2Z" fill="currentColor" fill-opacity="0.36"/><path d="M63.5 25.5L63.2 24.4L63.1 23L63.2 21.5L63.5 20.2L64.2 19.1L65.5 18.2L67.3 17.4L69.2 16.7L71 16.5L72.2 16.7L73 17.8L73.4 19.5L73.5 21.6L73.4 23.5L73.1 25L72.4 26.1L71.2 26.9L69.9 27.6L68.6 28L67.5 28.1L66.5 28L65.6 27.7L64.7 27.1L64 26.3L63.5 25.5Z" fill="currentColor" fill-opacity="0.36"/><path d="M71.9 32.5L72 31.4L72.4 30.1L73.1 28.8L73.9 27.6L75 26.9L76.5 26.6L78.4 26.5L80.5 26.6L82.2 27L83.3 27.8L83.5 29L83.3 30.8L82.6 32.7L81.8 34.5L80.9 35.8L79.8 36.5L78.5 36.8L77 36.9L75.6 36.8L74.5 36.5L73.7 36L72.9 35.3L72.3 34.4L72 33.5L71.9 32.5Z" fill="currentColor" fill-opacity="0.36"/><path d="M76.9 42.2L77.5 41.2L78.4 40.2L79.4 39.2L80.7 38.5L81.9 38.2L83.4 38.5L85.3 39.1L87.1 40.1L88.5 41.1L89.2 42.2L89 43.5L88.1 45L86.7 46.5L85.3 47.9L84 48.7L82.7 48.9L81.3 48.7L80 48.2L78.7 47.6L77.8 46.9L77.2 46.2L76.8 45.2L76.6 44.2L76.6 43.1L76.9 42.2Z" fill="currentColor" fill-opacity="0.36"/><path d="M77.8 53.1L78.7 52.4L80 51.8L81.3 51.3L82.7 51.1L84 51.3L85.3 52.1L86.7 53.5L88.1 55L89 56.5L89.2 57.8L88.5 58.9L87.1 59.9L85.3 60.9L83.4 61.5L81.9 61.8L80.7 61.5L79.4 60.8L78.4 59.8L77.5 58.8L76.9 57.8L76.6 56.9L76.6 55.8L76.8 54.8L77.2 53.8L77.8 53.1Z" fill="currentColor" fill-opacity="0.36"/><path d="M74.5 63.5L75.6 63.2L77 63.1L78.5 63.2L79.8 63.5L80.9 64.2L81.8 65.5L82.6 67.3L83.3 69.2L83.5 71L83.3 72.2L82.2 73L80.5 73.4L78.4 73.5L76.5 73.4L75 73.1L73.9 72.4L73.1 71.2L72.4 69.9L72 68.6L71.9 67.5L72 66.5L72.3 65.6L72.9 64.7L73.7 64L74.5 63.5Z" fill="currentColor" fill-opacity="0.36"/><path d="M67.5 71.9L68.6 72L69.9 72.4L71.2 73.1L72.4 73.9L73.1 75L73.4 76.5L73.5 78.4L73.4 80.5L73 82.2L72.2 83.3L71 83.5L69.2 83.3L67.3 82.6L65.5 81.8L64.2 80.9L63.5 79.8L63.2 78.5L63.1 77L63.2 75.6L63.5 74.5L64 73.7L64.7 72.9L65.6 72.3L66.5 72L67.5 71.9Z" fill="currentColor" fill-opacity="0.36"/><path d="M57.8 76.9L58.8 77.5L59.8 78.4L60.8 79.4L61.5 80.7L61.8 81.9L61.5 83.4L60.9 85.3L59.9 87.1L58.9 88.5L57.8 89.2L56.5 89L55 88.1L53.5 86.7L52.1 85.3L51.3 84L51.1 82.7L51.3 81.3L51.8 80L52.4 78.7L53.1 77.8L53.8 77.2L54.8 76.8L55.8 76.6L56.9 76.6L57.8 76.9Z" fill="currentColor" fill-opacity="0.36"/><path d="M46.9 77.8L47.6 78.7L48.2 80L48.7 81.3L48.9 82.7L48.7 84L47.9 85.3L46.5 86.7L45 88.1L43.5 89L42.2 89.2L41.1 88.5L40.1 87.1L39.1 85.3L38.5 83.4L38.2 81.9L38.5 80.7L39.2 79.4L40.2 78.4L41.2 77.5L42.2 76.9L43.1 76.6L44.2 76.6L45.2 76.8L46.2 77.2L46.9 77.8Z" fill="currentColor" fill-opacity="0.36"/><path d="M36.5 74.5L36.8 75.6L36.9 77L36.8 78.5L36.5 79.8L35.8 80.9L34.5 81.8L32.7 82.6L30.8 83.3L29 83.5L27.8 83.3L27 82.2L26.6 80.5L26.5 78.4L26.6 76.5L26.9 75L27.6 73.9L28.8 73.1L30.1 72.4L31.4 72L32.5 71.9L33.5 72L34.4 72.3L35.3 72.9L36 73.7L36.5 74.5Z" fill="currentColor" fill-opacity="0.36"/><path d="M28.1 67.5L28 68.6L27.6 69.9L26.9 71.2L26.1 72.4L25 73.1L23.5 73.4L21.6 73.5L19.5 73.4L17.8 73L16.7 72.2L16.5 71L16.7 69.2L17.4 67.3L18.2 65.5L19.1 64.2L20.2 63.5L21.5 63.2L23 63.1L24.4 63.2L25.5 63.5L26.3 64L27.1 64.7L27.7 65.6L28 66.5L28.1 67.5Z" fill="currentColor" fill-opacity="0.36"/><path d="M23.1 57.8L22.5 58.8L21.6 59.8L20.6 60.8L19.3 61.5L18.1 61.8L16.6 61.5L14.7 60.9L12.9 59.9L11.5 58.9L10.8 57.8L11 56.5L11.9 55L13.3 53.5L14.7 52.1L16 51.3L17.3 51.1L18.7 51.3L20 51.8L21.3 52.4L22.2 53.1L22.8 53.8L23.2 54.8L23.4 55.8L23.4 56.9L23.1 57.8Z" fill="currentColor" fill-opacity="0.36"/><path d="M22.2 46.9L21.3 47.6L20 48.2L18.7 48.7L17.3 48.9L16 48.7L14.7 47.9L13.3 46.5L11.9 45L11 43.5L10.8 42.2L11.5 41.1L12.9 40.1L14.7 39.1L16.6 38.5L18.1 38.2L19.3 38.5L20.6 39.2L21.6 40.2L22.5 41.2L23.1 42.2L23.4 43.1L23.4 44.2L23.2 45.2L22.8 46.2L22.2 46.9Z" fill="currentColor" fill-opacity="0.36"/><path d="M25.5 36.5L24.4 36.8L23 36.9L21.5 36.8L20.2 36.5L19.1 35.8L18.2 34.5L17.4 32.7L16.7 30.8L16.5 29L16.7 27.8L17.8 27L19.5 26.6L21.6 26.5L23.5 26.6L25 26.9L26.1 27.6L26.9 28.8L27.6 30.1L28 31.4L28.1 32.5L28 33.5L27.7 34.4L27.1 35.3L26.3 36L25.5 36.5Z" fill="currentColor" fill-opacity="0.36"/><path d="M32.5 28.1L31.4 28L30.1 27.6L28.8 26.9L27.6 26.1L26.9 25L26.6 23.5L26.5 21.6L26.6 19.5L27 17.8L27.8 16.7L29 16.5L30.8 16.7L32.7 17.4L34.5 18.2L35.8 19.1L36.5 20.2L36.8 21.5L36.9 23L36.8 24.4L36.5 25.5L36 26.3L35.3 27.1L34.4 27.7L33.5 28L32.5 28.1Z" fill="currentColor" fill-opacity="0.36"/><path d="M42.2 23.1L41.2 22.5L40.2 21.6L39.2 20.6L38.5 19.3L38.2 18.1L38.5 16.6L39.1 14.7L40.1 12.9L41.1 11.5L42.2 10.8L43.5 11L45 11.9L46.5 13.3L47.9 14.7L48.7 16L48.9 17.3L48.7 18.7L48.2 20L47.6 21.3L46.9 22.2L46.2 22.8L45.2 23.2L44.2 23.4L43.1 23.4L42.2 23.1Z" fill="currentColor" fill-opacity="0.36"/><path d="M57 50L57 50.6L56.9 51.2L56.8 51.8L56.6 52.4L56.3 53L56.1 53.5L55.7 54L55.4 54.5L54.9 54.9L54.5 55.4L54 55.7L53.5 56.1L53 56.3L52.4 56.6L51.8 56.8L51.2 56.9L50.6 57L50 57L49.4 57L48.8 56.9L48.2 56.8L47.6 56.6L47 56.3L46.5 56.1L46 55.7L45.5 55.4L45.1 54.9L44.6 54.5L44.3 54L43.9 53.5L43.7 53L43.4 52.4L43.2 51.8L43.1 51.2L43 50.6L43 50L43 49.4L43.1 48.8L43.2 48.2L43.4 47.6L43.7 47L43.9 46.5L44.3 46L44.6 45.5L45.1 45.1L45.5 44.6L46 44.3L46.5 43.9L47 43.7L47.6 43.4L48.2 43.2L48.8 43.1L49.4 43L50 43L50.6 43L51.2 43.1L51.8 43.2L52.4 43.4L53 43.7L53.5 43.9L54 44.3L54.5 44.6L54.9 45.1L55.4 45.5L55.7 46L56.1 46.5L56.3 47L56.6 47.6L56.8 48.2L56.9 48.8L57 49.4L57 50" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M64 50L63.9 51.2L63.8 52.4L63.5 53.6L63.2 54.8L62.7 55.9L62.1 57L61.5 58L60.7 59L59.9 59.9L59 60.7L58 61.5L57 62.1L55.9 62.7L54.8 63.2L53.6 63.5L52.4 63.8L51.2 63.9L50 64L48.8 63.9L47.6 63.8L46.4 63.5L45.2 63.2L44.1 62.7L43 62.1L42 61.5L41 60.7L40.1 59.9L39.3 59L38.5 58L37.9 57L37.3 55.9L36.8 54.8L36.5 53.6L36.2 52.4L36.1 51.2L36 50L36.1 48.8L36.2 47.6L36.5 46.4L36.8 45.2L37.3 44.1L37.9 43L38.5 42L39.3 41L40.1 40.1L41 39.3L42 38.5L43 37.9L44.1 37.3L45.2 36.8L46.4 36.5L47.6 36.2L48.8 36.1L50 36L51.2 36.1L52.4 36.2L53.6 36.5L54.8 36.8L55.9 37.3L57 37.9L58 38.5L59 39.3L59.9 40.1L60.7 41L61.5 42L62.1 43L62.7 44.1L63.2 45.2L63.5 46.4L63.8 47.6L63.9 48.8L64 50" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M48.6 36.1L48.1 35.3L47.5 34.2L46.9 32.9L46.5 31.6L46.5 30.3L46.8 28.9L47.5 27.2L48.3 25.6L49.2 24.5L50 24L50.8 24.5L51.7 25.6L52.5 27.2L53.2 28.9L53.5 30.3L53.5 31.6L53.1 32.9L52.5 34.2L51.9 35.3L51.4 36.1L50.8 36.5L50.3 36.8L49.7 36.8L49.2 36.5L48.6 36.1" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M54.1 36.6L53.9 35.7L53.7 34.4L53.7 33L53.9 31.7L54.3 30.5L55.1 29.3L56.4 28L57.8 26.9L59 26.1L59.9 26L60.5 26.7L60.9 28.1L61 29.9L61 31.7L60.8 33.2L60.2 34.3L59.4 35.4L58.4 36.4L57.4 37.1L56.6 37.6L55.9 37.9L55.3 37.9L54.8 37.7L54.4 37.2L54.1 36.6" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M58.9 39.2L59 38.2L59.4 37L59.9 35.7L60.6 34.5L61.4 33.6L62.7 32.8L64.3 32.1L66 31.6L67.5 31.4L68.4 31.6L68.6 32.5L68.4 34L67.9 35.7L67.2 37.3L66.4 38.6L65.5 39.4L64.3 40.1L63 40.6L61.8 41L60.8 41.1L60.1 41.1L59.6 40.8L59.2 40.4L58.9 39.9L58.9 39.2" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M62.4 43.4L62.9 42.6L63.6 41.6L64.6 40.6L65.7 39.8L66.8 39.2L68.3 39L70.1 39L71.9 39.1L73.3 39.5L74 40.1L73.9 41L73.1 42.2L72 43.6L70.7 44.9L69.5 45.7L68.3 46.1L67 46.3L65.6 46.3L64.3 46.1L63.4 45.9L62.8 45.6L62.3 45.2L62.1 44.7L62.1 44.1L62.4 43.4" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M63.9 48.6L64.7 48.1L65.8 47.5L67.1 46.9L68.4 46.5L69.7 46.5L71.1 46.8L72.8 47.5L74.4 48.3L75.5 49.2L76 50L75.5 50.8L74.4 51.7L72.8 52.5L71.1 53.2L69.7 53.5L68.4 53.5L67.1 53.1L65.8 52.5L64.7 51.9L63.9 51.4L63.5 50.8L63.2 50.3L63.2 49.7L63.5 49.2L63.9 48.6" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M63.4 54.1L64.3 53.9L65.6 53.7L67 53.7L68.3 53.9L69.5 54.3L70.7 55.1L72 56.4L73.1 57.8L73.9 59L74 59.9L73.3 60.5L71.9 60.9L70.1 61L68.3 61L66.8 60.8L65.7 60.2L64.6 59.4L63.6 58.4L62.9 57.4L62.4 56.6L62.1 55.9L62.1 55.3L62.3 54.8L62.8 54.4L63.4 54.1" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M60.8 58.9L61.8 59L63 59.4L64.3 59.9L65.5 60.6L66.4 61.4L67.2 62.7L67.9 64.3L68.4 66L68.6 67.5L68.4 68.4L67.5 68.6L66 68.4L64.3 67.9L62.7 67.2L61.4 66.4L60.6 65.5L59.9 64.3L59.4 63L59 61.8L58.9 60.8L58.9 60.1L59.2 59.6L59.6 59.2L60.1 58.9L60.8 58.9" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M56.6 62.4L57.4 62.9L58.4 63.6L59.4 64.6L60.2 65.7L60.8 66.8L61 68.3L61 70.1L60.9 71.9L60.5 73.3L59.9 74L59 73.9L57.8 73.1L56.4 72L55.1 70.7L54.3 69.5L53.9 68.3L53.7 67L53.7 65.6L53.9 64.3L54.1 63.4L54.4 62.8L54.8 62.3L55.3 62.1L55.9 62.1L56.6 62.4" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M51.4 63.9L51.9 64.7L52.5 65.8L53.1 67.1L53.5 68.4L53.5 69.7L53.2 71.1L52.5 72.8L51.7 74.4L50.8 75.5L50 76L49.2 75.5L48.3 74.4L47.5 72.8L46.8 71.1L46.5 69.7L46.5 68.4L46.9 67.1L47.5 65.8L48.1 64.7L48.6 63.9L49.2 63.5L49.7 63.2L50.3 63.2L50.8 63.5L51.4 63.9" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M45.9 63.4L46.1 64.3L46.3 65.6L46.3 67L46.1 68.3L45.7 69.5L44.9 70.7L43.6 72L42.2 73.1L41 73.9L40.1 74L39.5 73.3L39.1 71.9L39 70.1L39 68.3L39.2 66.8L39.8 65.7L40.6 64.6L41.6 63.6L42.6 62.9L43.4 62.4L44.1 62.1L44.7 62.1L45.2 62.3L45.6 62.8L45.9 63.4" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M41.1 60.8L41 61.8L40.6 63L40.1 64.3L39.4 65.5L38.6 66.4L37.3 67.2L35.7 67.9L34 68.4L32.5 68.6L31.6 68.4L31.4 67.5L31.6 66L32.1 64.3L32.8 62.7L33.6 61.4L34.5 60.6L35.7 59.9L37 59.4L38.2 59L39.2 58.9L39.9 58.9L40.4 59.2L40.8 59.6L41.1 60.1L41.1 60.8" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M37.6 56.6L37.1 57.4L36.4 58.4L35.4 59.4L34.3 60.2L33.2 60.8L31.7 61L29.9 61L28.1 60.9L26.7 60.5L26 59.9L26.1 59L26.9 57.8L28 56.4L29.3 55.1L30.5 54.3L31.7 53.9L33 53.7L34.4 53.7L35.7 53.9L36.6 54.1L37.2 54.4L37.7 54.8L37.9 55.3L37.9 55.9L37.6 56.6" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M36.1 51.4L35.3 51.9L34.2 52.5L32.9 53.1L31.6 53.5L30.3 53.5L28.9 53.2L27.2 52.5L25.6 51.7L24.5 50.8L24 50L24.5 49.2L25.6 48.3L27.2 47.5L28.9 46.8L30.3 46.5L31.6 46.5L32.9 46.9L34.2 47.5L35.3 48.1L36.1 48.6L36.5 49.2L36.8 49.7L36.8 50.3L36.5 50.8L36.1 51.4" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M36.6 45.9L35.7 46.1L34.4 46.3L33 46.3L31.7 46.1L30.5 45.7L29.3 44.9L28 43.6L26.9 42.2L26.1 41L26 40.1L26.7 39.5L28.1 39.1L29.9 39L31.7 39L33.2 39.2L34.3 39.8L35.4 40.6L36.4 41.6L37.1 42.6L37.6 43.4L37.9 44.1L37.9 44.7L37.7 45.2L37.2 45.6L36.6 45.9" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M39.2 41.1L38.2 41L37 40.6L35.7 40.1L34.5 39.4L33.6 38.6L32.8 37.3L32.1 35.7L31.6 34L31.4 32.5L31.6 31.6L32.5 31.4L34 31.6L35.7 32.1L37.3 32.8L38.6 33.6L39.4 34.5L40.1 35.7L40.6 37L41 38.2L41.1 39.2L41.1 39.9L40.8 40.4L40.4 40.8L39.9 41.1L39.2 41.1" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M43.4 37.6L42.6 37.1L41.6 36.4L40.6 35.4L39.8 34.3L39.2 33.2L39 31.7L39 29.9L39.1 28.1L39.5 26.7L40.1 26L41 26.1L42.2 26.9L43.6 28L44.9 29.3L45.7 30.5L46.1 31.7L46.3 33L46.3 34.4L46.1 35.7L45.9 36.6L45.6 37.2L45.2 37.7L44.7 37.9L44.1 37.9L43.4 37.6" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M78 50L77.9 52.4L77.6 54.9L77 57.2L76.3 59.6L75.4 61.8L74.2 64L72.9 66.1L71.4 68L69.8 69.8L68 71.4L66.1 72.9L64 74.2L61.8 75.4L59.6 76.3L57.2 77L54.9 77.6L52.4 77.9L50 78L47.6 77.9L45.1 77.6L42.8 77L40.4 76.3L38.2 75.4L36 74.2L33.9 72.9L32 71.4L30.2 69.8L28.6 68L27.1 66.1L25.8 64L24.6 61.8L23.7 59.6L23 57.2L22.4 54.9L22.1 52.4L22 50L22.1 47.6L22.4 45.1L23 42.8L23.7 40.4L24.6 38.2L25.8 36L27.1 33.9L28.6 32L30.2 30.2L32 28.6L33.9 27.1L36 25.8L38.2 24.6L40.4 23.7L42.8 23L45.1 22.4L47.6 22.1L50 22L52.4 22.1L54.9 22.4L57.2 23L59.6 23.7L61.8 24.6L64 25.8L66.1 27.1L68 28.6L69.8 30.2L71.4 32L72.9 33.9L74.2 36L75.4 38.2L76.3 40.4L77 42.8L77.6 45.1L77.9 47.6L78 50" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M53.1 22.2L52.4 21.3L51.8 20L51.3 18.7L51.1 17.3L51.3 16L52.1 14.7L53.5 13.3L55 11.9L56.5 11L57.8 10.8L58.9 11.5L59.9 12.9L60.9 14.7L61.5 16.6L61.8 18.1L61.5 19.3L60.8 20.6L59.8 21.6L58.8 22.5L57.8 23.1L56.9 23.4L55.8 23.4L54.8 23.2L53.8 22.8L53.1 22.2" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M63.5 25.5L63.2 24.4L63.1 23L63.2 21.5L63.5 20.2L64.2 19.1L65.5 18.2L67.3 17.4L69.2 16.7L71 16.5L72.2 16.7L73 17.8L73.4 19.5L73.5 21.6L73.4 23.5L73.1 25L72.4 26.1L71.2 26.9L69.9 27.6L68.6 28L67.5 28.1L66.5 28L65.6 27.7L64.7 27.1L64 26.3L63.5 25.5" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M71.9 32.5L72 31.4L72.4 30.1L73.1 28.8L73.9 27.6L75 26.9L76.5 26.6L78.4 26.5L80.5 26.6L82.2 27L83.3 27.8L83.5 29L83.3 30.8L82.6 32.7L81.8 34.5L80.9 35.8L79.8 36.5L78.5 36.8L77 36.9L75.6 36.8L74.5 36.5L73.7 36L72.9 35.3L72.3 34.4L72 33.5L71.9 32.5" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M76.9 42.2L77.5 41.2L78.4 40.2L79.4 39.2L80.7 38.5L81.9 38.2L83.4 38.5L85.3 39.1L87.1 40.1L88.5 41.1L89.2 42.2L89 43.5L88.1 45L86.7 46.5L85.3 47.9L84 48.7L82.7 48.9L81.3 48.7L80 48.2L78.7 47.6L77.8 46.9L77.2 46.2L76.8 45.2L76.6 44.2L76.6 43.1L76.9 42.2" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M77.8 53.1L78.7 52.4L80 51.8L81.3 51.3L82.7 51.1L84 51.3L85.3 52.1L86.7 53.5L88.1 55L89 56.5L89.2 57.8L88.5 58.9L87.1 59.9L85.3 60.9L83.4 61.5L81.9 61.8L80.7 61.5L79.4 60.8L78.4 59.8L77.5 58.8L76.9 57.8L76.6 56.9L76.6 55.8L76.8 54.8L77.2 53.8L77.8 53.1" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M74.5 63.5L75.6 63.2L77 63.1L78.5 63.2L79.8 63.5L80.9 64.2L81.8 65.5L82.6 67.3L83.3 69.2L83.5 71L83.3 72.2L82.2 73L80.5 73.4L78.4 73.5L76.5 73.4L75 73.1L73.9 72.4L73.1 71.2L72.4 69.9L72 68.6L71.9 67.5L72 66.5L72.3 65.6L72.9 64.7L73.7 64L74.5 63.5" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M67.5 71.9L68.6 72L69.9 72.4L71.2 73.1L72.4 73.9L73.1 75L73.4 76.5L73.5 78.4L73.4 80.5L73 82.2L72.2 83.3L71 83.5L69.2 83.3L67.3 82.6L65.5 81.8L64.2 80.9L63.5 79.8L63.2 78.5L63.1 77L63.2 75.6L63.5 74.5L64 73.7L64.7 72.9L65.6 72.3L66.5 72L67.5 71.9" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M57.8 76.9L58.8 77.5L59.8 78.4L60.8 79.4L61.5 80.7L61.8 81.9L61.5 83.4L60.9 85.3L59.9 87.1L58.9 88.5L57.8 89.2L56.5 89L55 88.1L53.5 86.7L52.1 85.3L51.3 84L51.1 82.7L51.3 81.3L51.8 80L52.4 78.7L53.1 77.8L53.8 77.2L54.8 76.8L55.8 76.6L56.9 76.6L57.8 76.9" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M46.9 77.8L47.6 78.7L48.2 80L48.7 81.3L48.9 82.7L48.7 84L47.9 85.3L46.5 86.7L45 88.1L43.5 89L42.2 89.2L41.1 88.5L40.1 87.1L39.1 85.3L38.5 83.4L38.2 81.9L38.5 80.7L39.2 79.4L40.2 78.4L41.2 77.5L42.2 76.9L43.1 76.6L44.2 76.6L45.2 76.8L46.2 77.2L46.9 77.8" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M36.5 74.5L36.8 75.6L36.9 77L36.8 78.5L36.5 79.8L35.8 80.9L34.5 81.8L32.7 82.6L30.8 83.3L29 83.5L27.8 83.3L27 82.2L26.6 80.5L26.5 78.4L26.6 76.5L26.9 75L27.6 73.9L28.8 73.1L30.1 72.4L31.4 72L32.5 71.9L33.5 72L34.4 72.3L35.3 72.9L36 73.7L36.5 74.5" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M28.1 67.5L28 68.6L27.6 69.9L26.9 71.2L26.1 72.4L25 73.1L23.5 73.4L21.6 73.5L19.5 73.4L17.8 73L16.7 72.2L16.5 71L16.7 69.2L17.4 67.3L18.2 65.5L19.1 64.2L20.2 63.5L21.5 63.2L23 63.1L24.4 63.2L25.5 63.5L26.3 64L27.1 64.7L27.7 65.6L28 66.5L28.1 67.5" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M23.1 57.8L22.5 58.8L21.6 59.8L20.6 60.8L19.3 61.5L18.1 61.8L16.6 61.5L14.7 60.9L12.9 59.9L11.5 58.9L10.8 57.8L11 56.5L11.9 55L13.3 53.5L14.7 52.1L16 51.3L17.3 51.1L18.7 51.3L20 51.8L21.3 52.4L22.2 53.1L22.8 53.8L23.2 54.8L23.4 55.8L23.4 56.9L23.1 57.8" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M22.2 46.9L21.3 47.6L20 48.2L18.7 48.7L17.3 48.9L16 48.7L14.7 47.9L13.3 46.5L11.9 45L11 43.5L10.8 42.2L11.5 41.1L12.9 40.1L14.7 39.1L16.6 38.5L18.1 38.2L19.3 38.5L20.6 39.2L21.6 40.2L22.5 41.2L23.1 42.2L23.4 43.1L23.4 44.2L23.2 45.2L22.8 46.2L22.2 46.9" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M25.5 36.5L24.4 36.8L23 36.9L21.5 36.8L20.2 36.5L19.1 35.8L18.2 34.5L17.4 32.7L16.7 30.8L16.5 29L16.7 27.8L17.8 27L19.5 26.6L21.6 26.5L23.5 26.6L25 26.9L26.1 27.6L26.9 28.8L27.6 30.1L28 31.4L28.1 32.5L28 33.5L27.7 34.4L27.1 35.3L26.3 36L25.5 36.5" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M32.5 28.1L31.4 28L30.1 27.6L28.8 26.9L27.6 26.1L26.9 25L26.6 23.5L26.5 21.6L26.6 19.5L27 17.8L27.8 16.7L29 16.5L30.8 16.7L32.7 17.4L34.5 18.2L35.8 19.1L36.5 20.2L36.8 21.5L36.9 23L36.8 24.4L36.5 25.5L36 26.3L35.3 27.1L34.4 27.7L33.5 28L32.5 28.1" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M42.2 23.1L41.2 22.5L40.2 21.6L39.2 20.6L38.5 19.3L38.2 18.1L38.5 16.6L39.1 14.7L40.1 12.9L41.1 11.5L42.2 10.8L43.5 11L45 11.9L46.5 13.3L47.9 14.7L48.7 16L48.9 17.3L48.7 18.7L48.2 20L47.6 21.3L46.9 22.2L46.2 22.8L45.2 23.2L44.2 23.4L43.1 23.4L42.2 23.1" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M91 50L90.8 53.6L90.4 57.1L89.6 60.6L88.5 64L87.2 67.3L85.5 70.5L83.6 73.5L81.4 76.4L79 79L76.4 81.4L73.5 83.6L70.5 85.5L67.3 87.2L64 88.5L60.6 89.6L57.1 90.4L53.6 90.8L50 91L46.4 90.8L42.9 90.4L39.4 89.6L36 88.5L32.7 87.2L29.5 85.5L26.5 83.6L23.6 81.4L21 79L18.6 76.4L16.4 73.5L14.5 70.5L12.8 67.3L11.5 64L10.4 60.6L9.6 57.1L9.2 53.6L9 50L9.2 46.4L9.6 42.9L10.4 39.4L11.5 36L12.8 32.7L14.5 29.5L16.4 26.5L18.6 23.6L21 21L23.6 18.6L26.5 16.4L29.5 14.5L32.7 12.8L36 11.5L39.4 10.4L42.9 9.6L46.4 9.2L50 9L53.6 9.2L57.1 9.6L60.6 10.4L64 11.5L67.3 12.8L70.5 14.5L73.5 16.4L76.4 18.6L79 21L81.4 23.6L83.6 26.5L85.5 29.5L87.2 32.7L88.5 36L89.6 39.4L90.4 42.9L90.8 46.4L91 50" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/>
</svg>
<figcaption>The Pookalam window, drawn by the generator: sixteen-fold, with the outer petals shifted half a fold. Shading stands in for the six festival colours. In the game it cuts into 22 panes and 51 regions of glass, the most of any window.</figcaption>
</figure>

A pookalam is Kerala's flower rangoli, made for Onam. It is begun on Atham, the first day of the ten-day festival, in the month of Chingam. On the first day only one kind of flower is used, more kinds are added each day, and the pookalam grows larger as the festival goes on ([Kerala Tourism](https://www.keralatourism.org/kerala-article/2021/pookkalam-onam/1104)). The first draft of the window's card said it was laid "ring by ring, one day at a time," which is the version you find on blogs. The official description is more careful, and the card now follows it.

Six windows make up the Festival collection:

| Window | Folds | Panes | Glass regions | Played by |
|---|---|---|---|---|
| Diya Petals | 8 | 21 | 19 | swapping |
| Marigold | 12 | 21 | 38 | the tray |
| Lamp Ring | 8 | 22 | 33 | rotating |
| Pookalam | 16 | 22 | 51 | swapping |
| Festival Star | 10 | 22 | 12 | the tray |
| Six Lanterns | 6 | 22 | 19 | turning rings |

Honesty requires a caveat here. Real rangoli is often figurative, with peacocks, lamps, lotuses and pots, and ours is not. The generator does geometry because geometry is what we can make without borrowing anyone's drawing. The figurative side of rangoli is where commissioning comes in, as it does for the next three traditions.

## Mandala, and the line we drew at yantra

The Rubin Museum puts it in one line: "The word mandala means a circle with a center" ([Rubin Museum](https://rubinmuseum.org/highlights/mandala/)). In Buddhist tantric practice, mandalas are aids to meditation and visualisation. The Tibetan sand mandala, *dul-tson-kyil-khor* or "mandala of colored powders" ([Asia Society](https://asiasociety.org/mandala-sand-painting-creating-enlightened-world)), is made from millions of grains of coloured sand. At the end, monks sweep it up and pour it into flowing water, enacting the impermanence of existence ([Smithsonian National Museum of Asian Art](https://asia-archive.si.edu/exhibition/about-the-mandala/)). Kolam and sand mandala share that ending: both are made in order to disappear.

The Rubin also notes that "a similar concept in Hinduism is a yantra", and this is where the line is. A yantra, in Stella Kramrisch's definition as quoted by the Indologist Gudrun Bühnemann, is "a geometrical contrivance by which any aspect of the Supreme Principle may be bound… to any spot for the purpose of worship." In most cases yantras "are considered to be representations of the deity himself" ([Bühnemann, Brill 2003](https://doi.org/10.1163/9789004492370_005)). The Sri Yantra, nine interlocking triangles around a central point called the *bindu*, is the best known ([Wikipedia](https://en.wikipedia.org/wiki/Sri_Yantra)). Scrambling a representation of a deity into hex panes for a stranger to reassemble is exactly what our third question rules out.

So the Mandala collection uses only the word's plainest meaning. The generator's doc comment says what it will not draw: *no yantra (no bindu-and-triangles), no deity, no script.* The palette is indigo, teal, saffron, rose, violet and sandstone. The Wheel's card reads: *"Mandala means circle. Here it is only that — geometry turning around a centre, for the pleasure of the pattern."*

<figure>
<svg viewBox="4 4 92 92" role="img" aria-label="A generated eight-fold mandala: a small central circle, eight petals, an eight-pointed star offset between them, an enclosing circle and a ring of eight small overlapping circles." style="width:100%;max-width:380px;height:auto;display:block;margin:0 auto">
<path d="M49 44.1L48.4 43.4L47.6 42.3L46.9 41.1L46.4 39.8L46.3 38.6L46.6 37.1L47.3 35.4L48.2 33.7L49.2 32.5L50 32L50.8 32.5L51.8 33.7L52.7 35.4L53.4 37.1L53.7 38.6L53.6 39.8L53.1 41.1L52.4 42.3L51.6 43.4L51 44.1L50.6 44.5L50.2 44.7L49.8 44.7L49.4 44.5L49 44.1Z" fill="currentColor" fill-opacity="0.18"/><path d="M53.5 45.1L53.5 44.2L53.7 42.9L54.1 41.6L54.7 40.3L55.4 39.3L56.7 38.5L58.4 37.8L60.2 37.2L61.8 37L62.7 37.3L63 38.2L62.8 39.8L62.2 41.6L61.5 43.3L60.7 44.6L59.7 45.3L58.4 45.9L57.1 46.3L55.8 46.5L54.9 46.5L54.3 46.5L53.8 46.4L53.6 46.2L53.5 45.7L53.5 45.1Z" fill="currentColor" fill-opacity="0.18"/><path d="M55.9 49L56.6 48.4L57.7 47.6L58.9 46.9L60.2 46.4L61.4 46.3L62.9 46.6L64.6 47.3L66.3 48.2L67.5 49.2L68 50L67.5 50.8L66.3 51.8L64.6 52.7L62.9 53.4L61.4 53.7L60.2 53.6L58.9 53.1L57.7 52.4L56.6 51.6L55.9 51L55.5 50.6L55.3 50.2L55.3 49.8L55.5 49.4L55.9 49Z" fill="currentColor" fill-opacity="0.18"/><path d="M54.9 53.5L55.8 53.5L57.1 53.7L58.4 54.1L59.7 54.7L60.7 55.4L61.5 56.7L62.2 58.4L62.8 60.2L63 61.8L62.7 62.7L61.8 63L60.2 62.8L58.4 62.2L56.7 61.5L55.4 60.7L54.7 59.7L54.1 58.4L53.7 57.1L53.5 55.8L53.5 54.9L53.5 54.3L53.6 53.8L53.8 53.6L54.3 53.5L54.9 53.5Z" fill="currentColor" fill-opacity="0.18"/><path d="M51 55.9L51.6 56.6L52.4 57.7L53.1 58.9L53.6 60.2L53.7 61.4L53.4 62.9L52.7 64.6L51.8 66.3L50.8 67.5L50 68L49.2 67.5L48.2 66.3L47.3 64.6L46.6 62.9L46.3 61.4L46.4 60.2L46.9 58.9L47.6 57.7L48.4 56.6L49 55.9L49.4 55.5L49.8 55.3L50.2 55.3L50.6 55.5L51 55.9Z" fill="currentColor" fill-opacity="0.18"/><path d="M46.5 54.9L46.5 55.8L46.3 57.1L45.9 58.4L45.3 59.7L44.6 60.7L43.3 61.5L41.6 62.2L39.8 62.8L38.2 63L37.3 62.7L37 61.8L37.2 60.2L37.8 58.4L38.5 56.7L39.3 55.4L40.3 54.7L41.6 54.1L42.9 53.7L44.2 53.5L45.1 53.5L45.7 53.5L46.2 53.6L46.4 53.8L46.5 54.3L46.5 54.9Z" fill="currentColor" fill-opacity="0.18"/><path d="M44.1 51L43.4 51.6L42.3 52.4L41.1 53.1L39.8 53.6L38.6 53.7L37.1 53.4L35.4 52.7L33.7 51.8L32.5 50.8L32 50L32.5 49.2L33.7 48.2L35.4 47.3L37.1 46.6L38.6 46.3L39.8 46.4L41.1 46.9L42.3 47.6L43.4 48.4L44.1 49L44.5 49.4L44.7 49.8L44.7 50.2L44.5 50.6L44.1 51Z" fill="currentColor" fill-opacity="0.18"/><path d="M45.1 46.5L44.2 46.5L42.9 46.3L41.6 45.9L40.3 45.3L39.3 44.6L38.5 43.3L37.8 41.6L37.2 39.8L37 38.2L37.3 37.3L38.2 37L39.8 37.2L41.6 37.8L43.3 38.5L44.6 39.3L45.3 40.3L45.9 41.6L46.3 42.9L46.5 44.2L46.5 45.1L46.5 45.7L46.4 46.2L46.2 46.4L45.7 46.5L45.1 46.5Z" fill="currentColor" fill-opacity="0.18"/><path d="M56 12L55.9 13L55.6 14.1L55.2 15L54.6 15.9L53.9 16.6L53 17.2L52.1 17.6L51 17.9L50 18L49 17.9L47.9 17.6L47 17.2L46.1 16.6L45.4 15.9L44.8 15L44.4 14.1L44.1 13L44 12L44.1 11L44.4 9.9L44.8 9L45.4 8.1L46.1 7.4L47 6.8L47.9 6.4L49 6.1L50 6L51 6.1L52.1 6.4L53 6.8L53.9 7.4L54.6 8.1L55.2 9L55.6 9.9L55.9 11L56 12Z" fill="currentColor" fill-opacity="0.36"/><path d="M82.9 23.1L82.8 24.2L82.5 25.2L82.1 26.1L81.5 27L80.7 27.7L79.9 28.3L78.9 28.8L77.9 29L76.9 29.1L75.8 29L74.8 28.8L73.9 28.3L73 27.7L72.3 27L71.7 26.1L71.2 25.2L71 24.2L70.9 23.1L71 22.1L71.2 21.1L71.7 20.1L72.3 19.3L73 18.5L73.9 17.9L74.8 17.5L75.8 17.2L76.9 17.1L77.9 17.2L78.9 17.5L79.9 17.9L80.7 18.5L81.5 19.3L82.1 20.1L82.5 21.1L82.8 22.1L82.9 23.1Z" fill="currentColor" fill-opacity="0.36"/><path d="M94 50L93.9 51L93.6 52.1L93.2 53L92.6 53.9L91.9 54.6L91 55.2L90.1 55.6L89 55.9L88 56L87 55.9L85.9 55.6L85 55.2L84.1 54.6L83.4 53.9L82.8 53L82.4 52.1L82.1 51L82 50L82.1 49L82.4 47.9L82.8 47L83.4 46.1L84.1 45.4L85 44.8L85.9 44.4L87 44.1L88 44L89 44.1L90.1 44.4L91 44.8L91.9 45.4L92.6 46.1L93.2 47L93.6 47.9L93.9 49L94 50Z" fill="currentColor" fill-opacity="0.36"/><path d="M82.9 76.9L82.8 77.9L82.5 78.9L82.1 79.9L81.5 80.7L80.7 81.5L79.9 82.1L78.9 82.5L77.9 82.8L76.9 82.9L75.8 82.8L74.8 82.5L73.9 82.1L73 81.5L72.3 80.7L71.7 79.9L71.2 78.9L71 77.9L70.9 76.9L71 75.8L71.2 74.8L71.7 73.9L72.3 73L73 72.3L73.9 71.7L74.8 71.2L75.8 71L76.9 70.9L77.9 71L78.9 71.2L79.9 71.7L80.7 72.3L81.5 73L82.1 73.9L82.5 74.8L82.8 75.8L82.9 76.9Z" fill="currentColor" fill-opacity="0.36"/><path d="M56 88L55.9 89L55.6 90.1L55.2 91L54.6 91.9L53.9 92.6L53 93.2L52.1 93.6L51 93.9L50 94L49 93.9L47.9 93.6L47 93.2L46.1 92.6L45.4 91.9L44.8 91L44.4 90.1L44.1 89L44 88L44.1 87L44.4 85.9L44.8 85L45.4 84.1L46.1 83.4L47 82.8L47.9 82.4L49 82.1L50 82L51 82.1L52.1 82.4L53 82.8L53.9 83.4L54.6 84.1L55.2 85L55.6 85.9L55.9 87L56 88Z" fill="currentColor" fill-opacity="0.36"/><path d="M29.1 76.9L29 77.9L28.8 78.9L28.3 79.9L27.7 80.7L27 81.5L26.1 82.1L25.2 82.5L24.2 82.8L23.1 82.9L22.1 82.8L21.1 82.5L20.1 82.1L19.3 81.5L18.5 80.7L17.9 79.9L17.5 78.9L17.2 77.9L17.1 76.9L17.2 75.8L17.5 74.8L17.9 73.9L18.5 73L19.3 72.3L20.1 71.7L21.1 71.2L22.1 71L23.1 70.9L24.2 71L25.2 71.2L26.1 71.7L27 72.3L27.7 73L28.3 73.9L28.8 74.8L29 75.8L29.1 76.9Z" fill="currentColor" fill-opacity="0.36"/><path d="M18 50L17.9 51L17.6 52.1L17.2 53L16.6 53.9L15.9 54.6L15 55.2L14.1 55.6L13 55.9L12 56L11 55.9L9.9 55.6L9 55.2L8.1 54.6L7.4 53.9L6.8 53L6.4 52.1L6.1 51L6 50L6.1 49L6.4 47.9L6.8 47L7.4 46.1L8.1 45.4L9 44.8L9.9 44.4L11 44.1L12 44L13 44.1L14.1 44.4L15 44.8L15.9 45.4L16.6 46.1L17.2 47L17.6 47.9L17.9 49L18 50Z" fill="currentColor" fill-opacity="0.36"/><path d="M29.1 23.1L29 24.2L28.8 25.2L28.3 26.1L27.7 27L27 27.7L26.1 28.3L25.2 28.8L24.2 29L23.1 29.1L22.1 29L21.1 28.8L20.1 28.3L19.3 27.7L18.5 27L17.9 26.1L17.5 25.2L17.2 24.2L17.1 23.1L17.2 22.1L17.5 21.1L17.9 20.1L18.5 19.3L19.3 18.5L20.1 17.9L21.1 17.5L22.1 17.2L23.1 17.1L24.2 17.2L25.2 17.5L26.1 17.9L27 18.5L27.7 19.3L28.3 20.1L28.8 21.1L29 22.1L29.1 23.1Z" fill="currentColor" fill-opacity="0.36"/><path d="M56 50L56 50.5L55.9 51L55.8 51.6L55.6 52.1L55.4 52.5L55.2 53L54.9 53.4L54.6 53.9L54.2 54.2L53.9 54.6L53.4 54.9L53 55.2L52.5 55.4L52.1 55.6L51.6 55.8L51 55.9L50.5 56L50 56L49.5 56L49 55.9L48.4 55.8L47.9 55.6L47.5 55.4L47 55.2L46.6 54.9L46.1 54.6L45.8 54.2L45.4 53.9L45.1 53.4L44.8 53L44.6 52.5L44.4 52.1L44.2 51.6L44.1 51L44 50.5L44 50L44 49.5L44.1 49L44.2 48.4L44.4 47.9L44.6 47.5L44.8 47L45.1 46.6L45.4 46.1L45.8 45.8L46.1 45.4L46.6 45.1L47 44.8L47.5 44.6L47.9 44.4L48.4 44.2L49 44.1L49.5 44L50 44L50.5 44L51 44.1L51.6 44.2L52.1 44.4L52.5 44.6L53 44.8L53.4 45.1L53.9 45.4L54.2 45.8L54.6 46.1L54.9 46.6L55.2 47L55.4 47.5L55.6 47.9L55.8 48.4L55.9 49L56 49.5L56 50" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M49 44.1L48.4 43.4L47.6 42.3L46.9 41.1L46.4 39.8L46.3 38.6L46.6 37.1L47.3 35.4L48.2 33.7L49.2 32.5L50 32L50.8 32.5L51.8 33.7L52.7 35.4L53.4 37.1L53.7 38.6L53.6 39.8L53.1 41.1L52.4 42.3L51.6 43.4L51 44.1L50.6 44.5L50.2 44.7L49.8 44.7L49.4 44.5L49 44.1" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M53.5 45.1L53.5 44.2L53.7 42.9L54.1 41.6L54.7 40.3L55.4 39.3L56.7 38.5L58.4 37.8L60.2 37.2L61.8 37L62.7 37.3L63 38.2L62.8 39.8L62.2 41.6L61.5 43.3L60.7 44.6L59.7 45.3L58.4 45.9L57.1 46.3L55.8 46.5L54.9 46.5L54.3 46.5L53.8 46.4L53.6 46.2L53.5 45.7L53.5 45.1" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M55.9 49L56.6 48.4L57.7 47.6L58.9 46.9L60.2 46.4L61.4 46.3L62.9 46.6L64.6 47.3L66.3 48.2L67.5 49.2L68 50L67.5 50.8L66.3 51.8L64.6 52.7L62.9 53.4L61.4 53.7L60.2 53.6L58.9 53.1L57.7 52.4L56.6 51.6L55.9 51L55.5 50.6L55.3 50.2L55.3 49.8L55.5 49.4L55.9 49" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M54.9 53.5L55.8 53.5L57.1 53.7L58.4 54.1L59.7 54.7L60.7 55.4L61.5 56.7L62.2 58.4L62.8 60.2L63 61.8L62.7 62.7L61.8 63L60.2 62.8L58.4 62.2L56.7 61.5L55.4 60.7L54.7 59.7L54.1 58.4L53.7 57.1L53.5 55.8L53.5 54.9L53.5 54.3L53.6 53.8L53.8 53.6L54.3 53.5L54.9 53.5" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M51 55.9L51.6 56.6L52.4 57.7L53.1 58.9L53.6 60.2L53.7 61.4L53.4 62.9L52.7 64.6L51.8 66.3L50.8 67.5L50 68L49.2 67.5L48.2 66.3L47.3 64.6L46.6 62.9L46.3 61.4L46.4 60.2L46.9 58.9L47.6 57.7L48.4 56.6L49 55.9L49.4 55.5L49.8 55.3L50.2 55.3L50.6 55.5L51 55.9" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M46.5 54.9L46.5 55.8L46.3 57.1L45.9 58.4L45.3 59.7L44.6 60.7L43.3 61.5L41.6 62.2L39.8 62.8L38.2 63L37.3 62.7L37 61.8L37.2 60.2L37.8 58.4L38.5 56.7L39.3 55.4L40.3 54.7L41.6 54.1L42.9 53.7L44.2 53.5L45.1 53.5L45.7 53.5L46.2 53.6L46.4 53.8L46.5 54.3L46.5 54.9" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M44.1 51L43.4 51.6L42.3 52.4L41.1 53.1L39.8 53.6L38.6 53.7L37.1 53.4L35.4 52.7L33.7 51.8L32.5 50.8L32 50L32.5 49.2L33.7 48.2L35.4 47.3L37.1 46.6L38.6 46.3L39.8 46.4L41.1 46.9L42.3 47.6L43.4 48.4L44.1 49L44.5 49.4L44.7 49.8L44.7 50.2L44.5 50.6L44.1 51" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M45.1 46.5L44.2 46.5L42.9 46.3L41.6 45.9L40.3 45.3L39.3 44.6L38.5 43.3L37.8 41.6L37.2 39.8L37 38.2L37.3 37.3L38.2 37L39.8 37.2L41.6 37.8L43.3 38.5L44.6 39.3L45.3 40.3L45.9 41.6L46.3 42.9L46.5 44.2L46.5 45.1L46.5 45.7L46.4 46.2L46.2 46.4L45.7 46.5L45.1 46.5" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M61.5 22.3L77.7 38.5L77.7 61.5L61.5 77.7L38.5 77.7L22.3 61.5L22.3 38.5L38.5 22.3L61.5 22.3" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M82 50L81.9 52.8L81.5 55.6L80.9 58.3L80.1 60.9L79 63.5L77.7 66L76.2 68.4L74.5 70.6L72.6 72.6L70.6 74.5L68.4 76.2L66 77.7L63.5 79L60.9 80.1L58.3 80.9L55.6 81.5L52.8 81.9L50 82L47.2 81.9L44.4 81.5L41.7 80.9L39.1 80.1L36.5 79L34 77.7L31.6 76.2L29.4 74.5L27.4 72.6L25.5 70.6L23.8 68.4L22.3 66L21 63.5L19.9 60.9L19.1 58.3L18.5 55.6L18.1 52.8L18 50L18.1 47.2L18.5 44.4L19.1 41.7L19.9 39.1L21 36.5L22.3 34L23.8 31.6L25.5 29.4L27.4 27.4L29.4 25.5L31.6 23.8L34 22.3L36.5 21L39.1 19.9L41.7 19.1L44.4 18.5L47.2 18.1L50 18L52.8 18.1L55.6 18.5L58.3 19.1L60.9 19.9L63.5 21L66 22.3L68.4 23.8L70.6 25.5L72.6 27.4L74.5 29.4L76.2 31.6L77.7 34L79 36.5L80.1 39.1L80.9 41.7L81.5 44.4L81.9 47.2L82 50" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M56 12L55.9 13L55.6 14.1L55.2 15L54.6 15.9L53.9 16.6L53 17.2L52.1 17.6L51 17.9L50 18L49 17.9L47.9 17.6L47 17.2L46.1 16.6L45.4 15.9L44.8 15L44.4 14.1L44.1 13L44 12L44.1 11L44.4 9.9L44.8 9L45.4 8.1L46.1 7.4L47 6.8L47.9 6.4L49 6.1L50 6L51 6.1L52.1 6.4L53 6.8L53.9 7.4L54.6 8.1L55.2 9L55.6 9.9L55.9 11L56 12" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M82.9 23.1L82.8 24.2L82.5 25.2L82.1 26.1L81.5 27L80.7 27.7L79.9 28.3L78.9 28.8L77.9 29L76.9 29.1L75.8 29L74.8 28.8L73.9 28.3L73 27.7L72.3 27L71.7 26.1L71.2 25.2L71 24.2L70.9 23.1L71 22.1L71.2 21.1L71.7 20.1L72.3 19.3L73 18.5L73.9 17.9L74.8 17.5L75.8 17.2L76.9 17.1L77.9 17.2L78.9 17.5L79.9 17.9L80.7 18.5L81.5 19.3L82.1 20.1L82.5 21.1L82.8 22.1L82.9 23.1" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M94 50L93.9 51L93.6 52.1L93.2 53L92.6 53.9L91.9 54.6L91 55.2L90.1 55.6L89 55.9L88 56L87 55.9L85.9 55.6L85 55.2L84.1 54.6L83.4 53.9L82.8 53L82.4 52.1L82.1 51L82 50L82.1 49L82.4 47.9L82.8 47L83.4 46.1L84.1 45.4L85 44.8L85.9 44.4L87 44.1L88 44L89 44.1L90.1 44.4L91 44.8L91.9 45.4L92.6 46.1L93.2 47L93.6 47.9L93.9 49L94 50" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M82.9 76.9L82.8 77.9L82.5 78.9L82.1 79.9L81.5 80.7L80.7 81.5L79.9 82.1L78.9 82.5L77.9 82.8L76.9 82.9L75.8 82.8L74.8 82.5L73.9 82.1L73 81.5L72.3 80.7L71.7 79.9L71.2 78.9L71 77.9L70.9 76.9L71 75.8L71.2 74.8L71.7 73.9L72.3 73L73 72.3L73.9 71.7L74.8 71.2L75.8 71L76.9 70.9L77.9 71L78.9 71.2L79.9 71.7L80.7 72.3L81.5 73L82.1 73.9L82.5 74.8L82.8 75.8L82.9 76.9" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M56 88L55.9 89L55.6 90.1L55.2 91L54.6 91.9L53.9 92.6L53 93.2L52.1 93.6L51 93.9L50 94L49 93.9L47.9 93.6L47 93.2L46.1 92.6L45.4 91.9L44.8 91L44.4 90.1L44.1 89L44 88L44.1 87L44.4 85.9L44.8 85L45.4 84.1L46.1 83.4L47 82.8L47.9 82.4L49 82.1L50 82L51 82.1L52.1 82.4L53 82.8L53.9 83.4L54.6 84.1L55.2 85L55.6 85.9L55.9 87L56 88" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M29.1 76.9L29 77.9L28.8 78.9L28.3 79.9L27.7 80.7L27 81.5L26.1 82.1L25.2 82.5L24.2 82.8L23.1 82.9L22.1 82.8L21.1 82.5L20.1 82.1L19.3 81.5L18.5 80.7L17.9 79.9L17.5 78.9L17.2 77.9L17.1 76.9L17.2 75.8L17.5 74.8L17.9 73.9L18.5 73L19.3 72.3L20.1 71.7L21.1 71.2L22.1 71L23.1 70.9L24.2 71L25.2 71.2L26.1 71.7L27 72.3L27.7 73L28.3 73.9L28.8 74.8L29 75.8L29.1 76.9" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M18 50L17.9 51L17.6 52.1L17.2 53L16.6 53.9L15.9 54.6L15 55.2L14.1 55.6L13 55.9L12 56L11 55.9L9.9 55.6L9 55.2L8.1 54.6L7.4 53.9L6.8 53L6.4 52.1L6.1 51L6 50L6.1 49L6.4 47.9L6.8 47L7.4 46.1L8.1 45.4L9 44.8L9.9 44.4L11 44.1L12 44L13 44.1L14.1 44.4L15 44.8L15.9 45.4L16.6 46.1L17.2 47L17.6 47.9L17.9 49L18 50" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/><path d="M29.1 23.1L29 24.2L28.8 25.2L28.3 26.1L27.7 27L27 27.7L26.1 28.3L25.2 28.8L24.2 29L23.1 29.1L22.1 29L21.1 28.8L20.1 28.3L19.3 27.7L18.5 27L17.9 26.1L17.5 25.2L17.2 24.2L17.1 23.1L17.2 22.1L17.5 21.1L17.9 20.1L18.5 19.3L19.3 18.5L20.1 17.9L21.1 17.5L22.1 17.2L23.1 17.1L24.2 17.2L25.2 17.5L26.1 17.9L27 18.5L27.7 19.3L28.3 20.1L28.8 21.1L29 22.1L29.1 23.1" fill="none" stroke="currentColor" stroke-width="0.8" stroke-linejoin="round"/>
</svg>
<figcaption>The Wheel: circle, petals, a star offset half a fold, and a ring of overlapping arcs. Secular geometry with no bindu, no triangles and no deity. It cuts into 22 panes and 26 regions.</figcaption>
</figure>

The five mandala windows are Wheel (8-fold, 26 regions), Lotus Circle (12-fold, 38), Star Garden (6-fold, 23), Rose Window (16-fold, 49) and Compass (8-fold, 18). Rose Window is where the two halves of the game meet: sixteen petals, lit as stained glass, a pattern that looks equally at home on a threshold and in a cathedral window.

Geometric ornament has deep Indian roots beyond the floor, too. The Harvard Art Museums hold a Mughal *jali*, a window screen from around 1580 drilled from a single slab of red sandstone into interlocking four-pointed stars. The museum notes that geometric patterning of that kind was introduced in the Islamic courts ([Harvard Art Museums](https://hvrd.art/o/216213)). Some of that geometry lives in the Mandala windows. None of it is copied from a particular screen.

## Gond, Madhubani and Warli: why they wait for artists

These three are the traditions players would recognise fastest, and they are the ones we have not built. We are not avoiding them. We have not paid for them yet.

### Gond

Gond painting grows out of the Pardhan Gond community's house art. *Digna* is geometric patterns worked in wet mud on walls, floors and doorways, made seasonally by women; *bhittichitra* is wall painting ([Pareek, International Journal of Intangible Heritage, 2022](https://ijih.org/volumes/article/1045)). What the world now calls Gond art is in large part the invention of one man. Around 1981, J. Swaminathan's team, collecting for the Roopankar museum at Bharat Bhavan in Bhopal, found Jangarh Singh Shyam in the village of Patangarh. Jangarh combined songs, stories and wall patterns into a style, the *Jangarh Kalam*, of forms filled with repeated, varying dots and lines ([Impart](https://imp-art.org/articles/jangarh-singh-shyam/)). "Gond Painting of Madhya Pradesh" became a registered Geographical Indication in 2022–23, announced in April 2023 ([ThePrint](https://theprint.in/india/madhya-pradeshs-gond-painting-gets-gi-tag/1511637/)).

For the game, Gond is the best of the three. Its strong outlines behave like lead lines, and the dotted fills would glow as glass. It is also unmistakably an **authored** style, traceable to named artists who are alive and working today.

### Madhubani (Mithila)

Mithila painting was made by women on the walls of their homes, above all the *kohbar*, the paintings of the nuptial chamber meant to bless a marriage with love, prosperity and fertility ([Sahapedia](https://www.sahapedia.org/mithila-painting)). The outside world saw it because of a disaster. After the 1934 Bihar earthquake, collapsed walls exposed the paintings, and the British officer W. G. Archer photographed them ([Asian Art Museum](https://exhibitions.asianart.org/exhibitions/painting-is-my-everything-art-from-indias-mithila-region/)). A second push came from the 1966–68 drought, when the Handicrafts Board sent the artist Bhaskar Kulkarni to encourage the women to put their wall paintings on paper as a source of income ([Sainsbury Centre](https://sainsburycentre.ac.uk/art-and-objects/50880-bull/)).

"Madhubani Painting" has been a GI since 2007–08. The GI shows how weak that protection can be for the artists themselves. Down To Earth reported in 2025 that the applicant was not an artists' association but the Government of Bihar's Director of Industries, and that only 51 authorised users are listed ([Down To Earth](https://www.downtoearth.org.in/governance/authenticity-in-question-why-madhubani-art-deserves-better-protection)). Much Mithila painting depicts deities, so a commissioned pack would be the fish, the birds and the flora, and nothing from the shrine.

### Warli

Warli painting belongs to the Warli community of Maharashtra. It is traditionally painted in rice paste by married women, with a human body drawn as two triangles touching at their tips ([Sahapedia](http://www.sahapedia.org/warli-painting)). At the centre of ritual Warli painting is the *chauk*, also called the *lagna chauk*: a square enclosing Palaghata Devi, the Warli goddess of fertility ([Impart](https://imp-art.org/articles/warli-painting/)). [Jivya Soma Mashe](https://imp-art.org/articles/jivya-soma-mashe/) moved it onto canvas and out of its ritual context, and received the Padma Shri in 2011. It became a GI in 2014.

Warli is also the tradition with the clearest record of what happens when outsiders use it without asking. Scroll reported that in 2017 the community group AYUSH sent a legal notice to a Dutch company that had trademarked Warli-style human figures, and that the company abandoned the design. In 2018 the group objected to a Bata footwear line as "disrespectful and demeaning", and Bata acquiesced. AYUSH's president described enforcing the GI as "far too expensive and cumbersome" ([Scroll, 2022](https://scroll.in/article/1026111/the-women-who-are-reclaiming-warli-art)). A game studio is exactly the kind of outsider in those stories. The marriage chauk is out entirely; everything else waits for a Warli artist.

### Why not generate them, or prompt for them?

Kolam and rangoli are shared practices. Millions of people draw them every morning, and the particular pattern our code generates belongs to nobody but us. Gond, Madhubani and Warli are different. They are styles of work, recognisable as the work of particular people and communities. A generator that imitated them would be imitating those people.

An image model is the same thing done faster. It takes the community's style without the community. The artists would recognise it immediately, and it is the version of this project most likely to end up in a news story. The concept board at the top of this post is the proof: a gorgeous Gond deer, painted by nobody. HCI researchers have begun asking these communities what generative AI means to them. There is a 2023 community-centred study of text-to-image models in South Asia ([Qadri et al., FAccT '23](https://arxiv.org/abs/2305.11844)), and a 2026 study of the Patua painters of Naya meeting generative AI ([Ghoshal and Ragavan, DIS '26](https://doi.org/10.1145/3800645.3813024)). I would rather read those than become an example in the next one.

### What a commission has to say

The rule we wrote down is short: these packs come only from **commissioned artists under a written licence**, the artist is credited by name in the level and in the credits, and the artist's fee is the cost of the pack. The law gives three reasons it has to be that specific. (What follows is my reading of the statutes, not legal advice; a lawyer reads the contract before money moves.)

- **An assignment must be in writing.** Section 19 of the [Copyright Act, 1957](https://copyright.gov.in/Documents/Copyrightrules1957.pdf) says no assignment is valid unless it is in writing and signed. It must identify the work and specify the rights, duration, territory and royalty. If the term is left out, it is deemed to be **five years**; if the territory is left out, it is presumed to be **India**. A handshake commission would expire, and not cover the US, the one country Shipaton requires.
- **Moral rights survive the sale.** Section 57 gives the author the right to claim authorship, and to restrain "any distortion, mutilation, modification or other act" prejudicial to their honour or reputation, independently of the copyright and even after assigning it. Cutting a painting into hexagons, scrambling it and snapping its lines to ports is a modification. So the contract has to say so plainly, and the artist sees the cut before it ships.
- **A GI protects an origin, not a style.** The [Geographical Indications Act, 1999](https://ipindia.gov.in/storage/uploads/docs-operator/5720e089-4967-408c-bc76-031d2a7fd72c.pdf) protects the use of an indication "in the designations or presentation of goods" that misleads about where they come from. So our copy will say "by [artist], [community]" and never imply that an unlicensed pack *is* Madhubani painting.

Until a commission is signed, the home screen will say these collections are coming with commissioned artists, and nothing in the game is drawn in their style.

## What stays out of the game entirely

Some of the board was never going to be a puzzle, however it was sourced:

- **Pattachitra.** Its main subject is Jagannath, and the paintings originated as substitutes for the deities during *Anasar*, the fortnight after the ritual bath when the temple images are not shown ([Live History India](https://www.livehistoryindia.com/story/living-culture/pattachitra)). That is not a picture to scramble.
- **Phad.** Bhopa priest-singers carry phad scrolls with them and use them as "the mobile temples of the folk deities", mostly Pabuji and Devnarayan ([Wikipedia](https://en.wikipedia.org/wiki/Phad_painting)). A temple is not a jigsaw.
- **Temple Kalamkari.** Kalamkari temple cloths were hangings and canopies commissioned by temples and monasteries, telling the Ramayana, the Mahabharata and the Puranas ([Impart](https://imp-art.org/articles/kalamkari/)). The florals and the Tree of Life are a possible future commission; the narrative cloths are not.
- **Deities anywhere.** No god, goddess or avatar is ever cut into pieces to be reassembled, whatever tradition they come from.
- **Yantras and the Warli marriage chauk.** These are ritual diagrams, not ornament.
- **Script.** No sacred syllables and no calligraphy that a player cannot read but someone else holds sacred.

This is not the only way to make these calls, and other people will draw the lines elsewhere. Games that draw on Indian art get read closely. *Raji: An Ancient Epic*, a Pune-made action game whose visuals drew on Pahari painting, was nominated for Best Debut at The Game Awards ([Wikipedia](https://en.wikipedia.org/wiki/Raji:_An_Ancient_Epic)). It was also criticised in Vice for what it left out of India ([Vice](https://www.vice.com/en/article/m7ajbv/raji-ancient-indian-epic-far-right-hindu-nationalism)). The standard I would actually like to meet is *Never Alone*, made with some forty Iñupiat elders ([Peabody Awards](https://peabodyawards.com/neveralone/)). This post is one developer reading. That gap is the honest reason three traditions are waiting.

## How a tradition becomes a window

The tradition matters only in the first of four steps. After that, a kolam and a heron are handled identically.

1. **A generator emits lead lines and coloured facets.** `KolamSpec.strokes()` returns the closed kolam curves and their dots; `OrnamentSpec.build()` returns rangoli or mandala strokes plus a coloured facet for every closed shape. Both produce exactly the shape of a hand-designed figure imported from our design tool, so nothing downstream knows which tradition it is cutting.
2. **The drawing is cut into 21–23 hex panes, with seven ports per edge.** It is seven because at five, a fern's stem visibly wobbled. The whole plane is displaced in one smooth motion onto the ports, rather than each line being bent at each seam, so strands that touch, like a frond on its stem, do not pull apart.
3. **Enclosed areas become glass.** The drawing is rasterised and flood-filled from the border. Every enclosed area becomes a region that lights when all the panes it touches are right. In a kolam, the regions are the lozenges between strands; in a pookalam, they are the petals and rings.
4. **Five gates, reported as counts, not a pass/fail status.** `dart run tool/glass_check.dart` checks every window for a unique solution, no two crossings sharing a port, no crossing too close to a corner, no rotation that shows the right ports but the wrong drawing, and at least one pane pinned by the outline alone.

The run from the day this post was written, trimmed to the columns discussed here:

```text
PASS  Lotus Sikku    tiles=23 ports=124 anchors=9  solutions=1 lookalikes=0 collisions=0 regions=35 mindless=1.00
PASS  Pookalam       tiles=22 ports=184 anchors=13 solutions=1 lookalikes=0 collisions=0 regions=51 mindless=1.00
PASS  Rose Window    tiles=22 ports=184 anchors=6  solutions=1 lookalikes=0 collisions=0 regions=49 mindless=1.00
...
25 of 25 levels pass every gate
```

Look at the last column. `mindless=1.00` means a player that turns any wrong pane to whatever fits its neighbours best finishes **every window, every time**. The step-by-step solver says the same thing from the other side: every rotation on every level can be read from the window's edge or from settled neighbours, and none needs looking ahead. On rotate, ChitraYatra is a jigsaw, not a deduction puzzle. Last month we [built eight bots to play every level of another game](/lab/eight-bots-played-all-500-levels), because there we needed to know whether levels were fair. Here we already know: they are easy. For now, that is deliberate. In our September market review of about 1,150 Play reviews of the genre's biggest titles, only about 4% of the low ratings complained that a game was too easy. Whether assembling a kolam is satisfying *enough* is the playtest question, not the validator's.

## Why build this for Shipaton at all

Shipaton's rules are simple: the app's first public release must fall inside the submission window, it must be downloadable in the US, and the RevenueCat SDK must power at least one purchase ([rules](https://revenuecat-shipaton-2026.devpost.com/rules)). This year there is a new **Best Game** award, judged on "great gameplay, art direction, and a monetization fit that suits the genre" ([RevenueCat](https://www.revenuecat.com/blog/company/announcing-shipaton-2026)).

Art direction is where a one-person studio can compete, and it is where this game was weakest. Rotate-to-connect is saturated: our review found that of 23 rotate, pipe and loop games released on Play between December 2025 and September 2026, 16 had under a thousand installs and none had more than ten thousand. The first version, a lattice that lit up to reveal a drawing and the one that was called Curvved, was one more of them, and after two playtests we stopped it. What no game in that list has is a tradition behind it. *Venba*, a short game about a Tamil family, won Best Debut Game at the 2024 BAFTA Games Awards ([Wikipedia](https://en.wikipedia.org/wiki/Venba_(video_game))) and the IGF's Seumas McNally Grand Prize ([Business Wire](https://www.businesswire.com/news/home/20240320279779/en/Venba-Wins-the-Seumas-McNally-Grand-Prize-at-the-26th-Annual-Independent-Games-Festival-Awards)). Culturally specific games travel, when they are made with care.

As of 13 September, when this was written, ChitraYatra had not been released, and the Glass version existed as test builds on one phone. The RevenueCat integration, the release and what the judges need from us are later posts in this series. The one decision already made is that the deadline does not get to decide the game: if it is not good by 30 September, it ships when it is.

## Verdict

Of the ten traditions on an image model's concept board, two survived three plain questions: is there a line, who owns it, and is it sacred. A third, mandala, came in as nothing but geometry. The one that survived best was not chosen for the mechanic; it turned out to *be* the mechanic. A sikku kolam is a line that loops around every dot and comes home, and a mirror curve on a coprime grid is that line, fifty years after Gift Siromoney first wrote kolam down as a grammar.

The measurements added two rules nobody asked for. Symmetry decides which kolams you can make, and on a square grid the only single-line fourfold kolams our sampler found are the ones a worldwide audience will misread. And the traditions players would recognise fastest, Gond, Madhubani and Warli, are the ones a generator must not touch, because a style that belongs to living people is not a pattern. It is their work. Those packs cost an artist's fee, a written contract under section 19 and a promise under section 57. Until we can pay for them, the shelf says so.

---

*All game figures are first-party: `tool/glass_check.dart` output on the `proto/glass` branch, and a sampling run against the game's own kolam generator (`KolamSpec`) on 13 September 2026, 4,000 random mirror sets per grid and seeded, so the table is reproducible. The symmetry results are counts from a sampler, not proofs: "no single line in 16,000 samples" means none was found, not that none exists. Market figures come from our own September 2026 review of Google Play. Statutory text is quoted from the official consolidations and is not legal advice. The figures in this post are drawn by the game's generators and are ours; no traditional artwork is reproduced.*

## FAQ

### What is a sikku kolam?

A sikku kolam is a South Indian threshold drawing, from Tamil Nadu, in which a single line loops around every dot in a grid of dots (pulli) without touching any of them and returns to its starting point. *Sikku* means knot. The single unbroken line is the culturally ideal form, sometimes called pavitram or Brahma-mudi, and it is drawn at dawn in rice flour at the door of a home.

### Why does a coprime dot grid give a single-line kolam?

A kolam on an m×n dot grid behaves like a mirror curve: a line bouncing diagonally between the midpoints of the grid's edges, reflecting off the border like a billiard ball. With no interior mirrors that construction draws exactly gcd(m, n) separate closed lines, a result stated for kolam by Shojiro Nagata (Forma, 2015) and for mirror curves by Slavik Jablan (Bridges, 2001). When m and n share no common factor, gcd is 1 and the whole kolam is one line; ChitraYatra's generator reproduces this on all 81 grids from 1×1 to 9×9.

### What is the difference between kolam and rangoli?

Kolam is the Tamil Nadu form of the Indian floor art that is called rangoli in Gujarat, Karnataka and Maharashtra, alpana in West Bengal, muggu in Andhra Pradesh and mandana in Rajasthan. Kolam is usually a white rice-flour line drawing made daily at dawn, often around a grid of dots, while rangoli usually refers to coloured powder or flower designs made for festivals such as Diwali. IIT Bombay's D'source lists more than a dozen regional names for the family.

### Can I use Madhubani, Gond or Warli art in a commercial game?

Only with a licence from the artist, in our reading of Indian law. Gond, Madhubani and Warli are authored styles practised by living artists and communities, and all three are registered Geographical Indications. The Indian Copyright Act requires an assignment to be in writing (Section 19), and gives the artist a right to object to distortion or modification that survives the sale (Section 57). ChitraYatra commissions these packs from artists under a written licence and never generates or AI-imitates the styles.

### What is a pookalam?

A pookalam is the flower rangoli made in Kerala for Onam. According to Kerala Tourism, it is begun on Atham, the first day of the ten-day festival, with a single kind of flower, and it grows larger each day as more kinds of flower are added. It is made to welcome the mythical king Mahabali.

### Is a mandala the same as a yantra?

No. Mandala means "a circle with a center" (Rubin Museum), and in Buddhist practice it is an aid to meditation, like the Tibetan sand mandala that is swept away when finished. A yantra is a Hindu geometric diagram used for worship, and is generally considered a representation of the deity itself. The Sri Yantra, nine interlocking triangles around a central bindu, is the best-known example. ChitraYatra's mandalas are secular geometry and never draw a yantra.

### What is RevenueCat Shipaton 2026?

Shipaton 2026 is RevenueCat's app-building competition, run on Devpost, with $740,000 in cash prizes. A project qualifies if its first public release lands on the App Store, Google Play or the Galaxy Store between 31 July and 30 September 2026, and it uses the RevenueCat SDK to power at least one in-app or web purchase. The 2026 edition adds a Best Game award judged on gameplay, art direction and monetization fit.

### Can kolam patterns be generated procedurally?

Yes. Treat the kolam as a mirror curve: a line bouncing through the edge midpoints of a dot grid, reflecting off the border and off chosen interior mirrors. ChitraYatra's generator walks that line, counts how many separate lines it drew, and keeps only mirror sets that give one line with mirror symmetry. On rectangular grids such as 5×7, about 10% of symmetric mirror sets keep the single line.

## Sources

- [RevenueCat Shipaton 2026](https://revenuecat-shipaton-2026.devpost.com/) and [official rules](https://revenuecat-shipaton-2026.devpost.com/rules) — Devpost
- [Announcing Shipaton 2026](https://www.revenuecat.com/blog/company/announcing-shipaton-2026) — Perttu Lähteenlahti and Charlie Chapman, RevenueCat, July 2026
- [Significance of Kolam in Tamil Culture](http://www.sahapedia.org/significance-of-kolam-tamil-culture) — Anni Kumari, Sahapedia
- [Female Aesthetics and Ecological Connect in Kolam](http://www.sahapedia.org/female-aesthetics-and-ecological-connect-kolam) — Shefali Rathi, Sahapedia
- [Feeding a Thousand Souls: Women, Ritual, and Ecology in India — An Exploration of the Kolam](https://repository.usfca.edu/faculty_books_all/39/) — Vijaya Nagarajan, Oxford University Press, 2018
- [Rangoli & Kolam: Threshold Arts of India](https://asiainch.org/craft/rangoli-kolam-threshold-arts-of-india/) — Asia InCH, Craft Revival Trust
- [Kolam](https://en.wikipedia.org/wiki/Kolam) — Wikipedia
- [Kolam Contest](https://mylaporefestival.in/2025/kolam_contest.html) — Sundaram Finance Mylapore Festival
- [Why the Mylapore Festival matters](https://www.dtnext.in/news/chennai/why-the-mylapore-festival-matters) — DT Next, January 2026
- [Array Grammars and Kolam](https://doi.org/10.1016/0146-664X(74)90011-2) — G. Siromoney, R. Siromoney and K. Krithivasan, Computer Graphics and Image Processing, 1974
- [The Kolam Tradition](https://www.americanscientist.org/article/the-kolam-tradition) — Marcia Ascher, American Scientist, 2002
- [Reconstruction and extension of lost symmetries: examples from the Tamil of South India](https://doi.org/10.1016/0898-1221(89)90261-7) — Paulus Gerdes, Computers & Mathematics with Applications, 1989
- [Mirror Curves](https://archive.bridgesmathart.org/2001/bridges2001-233.pdf) — Slavik Jablan, Bridges 2001
- [How Many Loops Kolam Loop Pattern Consists of](https://www.jstage.jst.go.jp/article/forma/30/1/30_9/_pdf/-char/en) — Shojiro Nagata, Forma, 2015
- [Mathematical Experiments with African Sona Designs](https://archive.bridgesmathart.org/2009/bridges2009-305.pdf) — Darrah Chavey, Bridges 2009
- [Sand Drawings and Mirror Curves](https://www.sciencenews.org/article/sand-drawings-and-mirror-curves) — Ivars Peterson, Science News, 2001
- [Sand drawings and Gaussian graphs](https://erikdemaine.org/papers/Sona_JMA/paper.pdf) — E. Demaine, M. Demaine, P. Taslakian and G. Toussaint, Journal of Mathematics and the Arts, 2007
- [A Topological Approach to Creating Any Pulli Kolam](https://arxiv.org/abs/1503.02130) — V. Gopalan and B. VanLeeuwen, Forma, 2015
- [Symmetry classification and enumeration of square-tile sikku kolams](https://doi.org/10.1080/17513472.2024.2423568) — Veena Gopalan, Journal of Mathematics and the Arts, 2024
- [History of the Swastika](https://encyclopedia.ushmm.org/content/en/article/history-of-the-swastika) — United States Holocaust Memorial Museum
- [The swastika and the problem of cultural appropriation](https://www.abc.net.au/religion/the-swastika-and-the-problem-of-cultural-appropriation/11811518) — Sangeetha Thanapal, ABC Religion & Ethics, 2019
- [Types of Rangolis](https://www.dsource.in/resource/rangoli/types-rangolis) — Madhuri Menon, D'source, IDC IIT Bombay
- [Rangoli](https://en.wikipedia.org/wiki/Rangoli) — Wikipedia
- [Pookkalam: Onam's floral carpet](https://www.keralatourism.org/kerala-article/2021/pookkalam-onam/1104) — Kerala Tourism, 2021
- [Mandala](https://rubinmuseum.org/highlights/mandala/) — Rubin Museum of Art
- [About the Mandala](https://asia-archive.si.edu/exhibition/about-the-mandala/) — Smithsonian National Museum of Asian Art
- [Mandala Sand Painting: Creating an Enlightened World](https://asiasociety.org/mandala-sand-painting-creating-enlightened-world) — Asia Society
- [Maṇḍala, Yantra and Cakra: Some Observations](https://doi.org/10.1163/9789004492370_005) — Gudrun Bühnemann, in Maṇḍalas and Yantras in the Hindu Traditions, Brill, 2003
- [Sri Yantra](https://en.wikipedia.org/wiki/Sri_Yantra) — Wikipedia
- [Pierced Window Screen (Jali)](https://hvrd.art/o/216213) — Harvard Art Museums
- ["We paint stories we heard from our ancestors": Intangible heritage of the Pardhan Gonds of Central India](https://ijih.org/volumes/article/1045) — Shivangi Pareek, International Journal of Intangible Heritage, 2022
- [Jangarh Singh Shyam](https://imp-art.org/articles/jangarh-singh-shyam/) — Impart Encyclopedia of Art
- [Madhya Pradesh's Gond painting gets GI tag](https://theprint.in/india/madhya-pradeshs-gond-painting-gets-gi-tag/1511637/) — ANI via ThePrint, April 2023
- [On Mithila Painting](https://www.sahapedia.org/mithila-painting) — Sahapedia
- [Painting is My Everything: Art from India's Mithila Region](https://exhibitions.asianart.org/exhibitions/painting-is-my-everything-art-from-indias-mithila-region/) — Asian Art Museum, San Francisco
- [Bull, by Shanti Devi](https://sainsburycentre.ac.uk/art-and-objects/50880-bull/) — Sainsbury Centre, University of East Anglia
- [Authenticity in question: Why Madhubani art deserves better protection](https://www.downtoearth.org.in/governance/authenticity-in-question-why-madhubani-art-deserves-better-protection) — Mohit Sharma, Down To Earth, November 2025
- [Warli Painting](http://www.sahapedia.org/warli-painting) — Mushtak Khan, Sahapedia
- [Warli Painting](https://imp-art.org/articles/warli-painting/) — Impart Encyclopedia of Art
- [The women who are reclaiming Warli art](https://scroll.in/article/1026111/the-women-who-are-reclaiming-warli-art) — Nolina Minj, Scroll, June 2022
- [Kalamkari](https://imp-art.org/articles/kalamkari/) — Impart Encyclopedia of Art
- [Pattachitra: The Heritage Art of Odisha](https://www.livehistoryindia.com/story/living-culture/pattachitra) — Akshata Mokashi, Live History India, 2021
- [Phad painting](https://en.wikipedia.org/wiki/Phad_painting) — Wikipedia
- [The Copyright Act, 1957 (with Rules)](https://copyright.gov.in/Documents/Copyrightrules1957.pdf) — Copyright Office, Government of India
- [The Geographical Indications of Goods (Registration and Protection) Act, 1999](https://ipindia.gov.in/storage/uploads/docs-operator/5720e089-4967-408c-bc76-031d2a7fd72c.pdf) — IP India
- [AI's Regimes of Representation: A Community-centered Study of Text-to-Image Models in South Asia](https://arxiv.org/abs/2305.11844) — R. Qadri, R. Shelby, C. Bennett and E. Denton, FAccT '23
- [When Heritage Folk Artists Meet Generative AI: A case of Chitrakars of Naya](https://doi.org/10.1145/3800645.3813024) — A. Ghoshal and S. Srinivasa Ragavan, DIS '26
- [Raji: An Ancient Epic](https://en.wikipedia.org/wiki/Raji:_An_Ancient_Epic) — Wikipedia
- [How 'Raji: An Ancient Epic' Falls into the Indian Far-Right's Trap](https://www.vice.com/en/article/m7ajbv/raji-ancient-indian-epic-far-right-hindu-nationalism) — Adesh Thapliyal, Vice, 2020
- [Never Alone (Kisima Inŋitchuŋa)](https://peabodyawards.com/neveralone/) — Peabody Awards
- [Venba (video game)](https://en.wikipedia.org/wiki/Venba_(video_game)) — Wikipedia
- [Venba Wins the Seumas McNally Grand Prize](https://www.businesswire.com/news/home/20240320279779/en/Venba-Wins-the-Seumas-McNally-Grand-Prize-at-the-26th-Annual-Independent-Games-Festival-Awards) — Business Wire, March 2024
