mapwright 0.18.0__tar.gz → 0.19.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. {mapwright-0.18.0 → mapwright-0.19.0}/CHANGELOG.md +18 -0
  2. {mapwright-0.18.0 → mapwright-0.19.0}/PKG-INFO +7 -3
  3. {mapwright-0.18.0 → mapwright-0.19.0}/README.md +6 -2
  4. mapwright-0.19.0/docs/gallery/hint.png +0 -0
  5. mapwright-0.19.0/docs/gallery/hint.svg +1 -0
  6. {mapwright-0.18.0 → mapwright-0.19.0}/examples/gallery.py +24 -0
  7. {mapwright-0.18.0 → mapwright-0.19.0}/pyproject.toml +1 -1
  8. {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/__init__.py +1 -1
  9. {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/terrain.py +62 -2
  10. {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_terrain.py +64 -0
  11. {mapwright-0.18.0 → mapwright-0.19.0}/.github/workflows/ci.yml +0 -0
  12. {mapwright-0.18.0 → mapwright-0.19.0}/.github/workflows/publish.yml +0 -0
  13. {mapwright-0.18.0 → mapwright-0.19.0}/.gitignore +0 -0
  14. {mapwright-0.18.0 → mapwright-0.19.0}/LICENSE +0 -0
  15. {mapwright-0.18.0 → mapwright-0.19.0}/NOTICE +0 -0
  16. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/age-old.png +0 -0
  17. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/age-old.svg +0 -0
  18. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/age-young.png +0 -0
  19. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/age-young.svg +0 -0
  20. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/archipelago.png +0 -0
  21. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/archipelago.svg +0 -0
  22. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/arctic.png +0 -0
  23. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/arctic.svg +0 -0
  24. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas.png +0 -0
  25. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/README.md +0 -0
  26. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/city_castle_1.png +0 -0
  27. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/city_large_1.png +0 -0
  28. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/city_town_1.png +0 -0
  29. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/city_village_1.png +0 -0
  30. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/decoration_compass_1.png +0 -0
  31. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/decoration_creature_1.png +0 -0
  32. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/decoration_ship_1.png +0 -0
  33. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/dune_1.png +0 -0
  34. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/hill_1.png +0 -0
  35. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/hill_2.png +0 -0
  36. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/manifest.json +0 -0
  37. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/mountain_mid_1.png +0 -0
  38. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/mountain_old_1.png +0 -0
  39. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/mountain_old_2.png +0 -0
  40. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/mountain_young_1.png +0 -0
  41. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/mountain_young_2.png +0 -0
  42. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/tree_cactus_1.png +0 -0
  43. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/tree_deciduous_1.png +0 -0
  44. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/tree_deciduous_2.png +0 -0
  45. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/tree_pine_1.png +0 -0
  46. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/tree_pine_2.png +0 -0
  47. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/citadel.png +0 -0
  48. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/citadel.svg +0 -0
  49. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/continent.png +0 -0
  50. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/continent.svg +0 -0
  51. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/desert.png +0 -0
  52. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/desert.svg +0 -0
  53. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/dungeon.png +0 -0
  54. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/dungeon.svg +0 -0
  55. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/highlands.png +0 -0
  56. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/highlands.svg +0 -0
  57. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/islands.png +0 -0
  58. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/islands.svg +0 -0
  59. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/pangaea.png +0 -0
  60. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/pangaea.svg +0 -0
  61. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/port.png +0 -0
  62. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/port.svg +0 -0
  63. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/regions.png +0 -0
  64. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/regions.svg +0 -0
  65. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/roads.png +0 -0
  66. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/roads.svg +0 -0
  67. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/template-atoll.png +0 -0
  68. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/template-atoll.svg +0 -0
  69. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/template-isthmus.png +0 -0
  70. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/template-isthmus.svg +0 -0
  71. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/theme-blueprint.png +0 -0
  72. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/theme-blueprint.svg +0 -0
  73. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/theme-citadel-neon.png +0 -0
  74. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/theme-citadel-neon.svg +0 -0
  75. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/theme-dune.png +0 -0
  76. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/theme-dune.svg +0 -0
  77. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/theme-dungeon-blueprint.png +0 -0
  78. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/theme-dungeon-blueprint.svg +0 -0
  79. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/theme-neon.png +0 -0
  80. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/theme-neon.svg +0 -0
  81. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/theme-parchment.png +0 -0
  82. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/theme-parchment.svg +0 -0
  83. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/town.png +0 -0
  84. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/town.svg +0 -0
  85. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/tropical.png +0 -0
  86. {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/tropical.svg +0 -0
  87. {mapwright-0.18.0 → mapwright-0.19.0}/examples/benchmark.py +0 -0
  88. {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/_geometry.py +0 -0
  89. {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/_graph.py +0 -0
  90. {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/_serde.py +0 -0
  91. {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/affordances.py +0 -0
  92. {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/atlas_renderer.py +0 -0
  93. {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/config.py +0 -0
  94. {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/dungeon.py +0 -0
  95. {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/dungeon_renderer.py +0 -0
  96. {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/names.py +0 -0
  97. {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/regions.py +0 -0
  98. {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/rng.py +0 -0
  99. {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/roads.py +0 -0
  100. {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/settlement.py +0 -0
  101. {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/settlement_renderer.py +0 -0
  102. {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/svg_renderer.py +0 -0
  103. {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/themes.py +0 -0
  104. {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_affordances.py +0 -0
  105. {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_api_contract.py +0 -0
  106. {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_atlas_renderer.py +0 -0
  107. {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_config.py +0 -0
  108. {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_dungeon.py +0 -0
  109. {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_dungeon_renderer.py +0 -0
  110. {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_geometry.py +0 -0
  111. {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_graph.py +0 -0
  112. {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_names.py +0 -0
  113. {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_properties.py +0 -0
  114. {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_regions.py +0 -0
  115. {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_rng.py +0 -0
  116. {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_roads.py +0 -0
  117. {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_serialize.py +0 -0
  118. {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_settlement.py +0 -0
  119. {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_svg_renderer.py +0 -0
  120. {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_themes.py +0 -0
@@ -8,6 +8,24 @@ All notable changes to mapwright are documented here. The format follows
8
8
  `tests/test_api_contract.py`). While the version is `0.x`, minor versions may
9
9
  make breaking changes; these will always be noted here.
10
10
 
11
+ ## [0.19.0] — 2026-06-02
12
+
13
+ ### Added
14
+ - **`elevation_hint` — art-direct the continent's shape.**
15
+ `RegionalTerrainGenerator.generate(..., elevation_hint=…)` lets a host (or an
16
+ LLM) supply the *macro* land/sea/elevation shape while mapwright fills in
17
+ organic coastlines, erosion, rivers and climate. Pass a coarse 2D grid (e.g. a
18
+ 16×16 nested list; rows north→south, cols west→east) or a callable
19
+ `f(x_norm, y_norm) -> elevation` over normalised [0, 1] coords. Only relative
20
+ ordering matters; `sea_level` still sets how much floods, and the full
21
+ hydrology/biome pipeline runs on top, so the result stays coherent (rivers
22
+ form, coasts are organic). Takes precedence over `template`; set
23
+ `edge_falloff=0` to allow land at the map borders. Purely additive — the
24
+ default (`elevation_hint=None`) output is byte-identical. This is the
25
+ most on-philosophy answer to "make shapes non-circular": the caller draws the
26
+ shape, mapwright does the physics (the mapgen4 hint-map idea, clean-room).
27
+ Gallery gains a hint-driven crescent continent.
28
+
11
29
  ## [0.18.0] — 2026-06-02
12
30
 
13
31
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mapwright
3
- Version: 0.18.0
3
+ Version: 0.19.0
4
4
  Summary: Domain-neutral procedural fantasy map & world generation: Voronoi terrain, hydraulic erosion, biomes, rivers, Markov place-names, and shaded-relief SVG.
5
5
  Project-URL: Homepage, https://github.com/sligara7/mapwright
6
6
  Project-URL: Repository, https://github.com/sligara7/mapwright
@@ -104,9 +104,13 @@ produced by [`examples/gallery.py`](examples/gallery.py):
104
104
  <td align="center"><img width="240" src="https://raw.githubusercontent.com/sligara7/mapwright/main/docs/gallery/age-young.png" alt="young jagged terrain"><br><sub><code>land_age=0</code> (young)</sub></td>
105
105
  <td align="center"><img width="240" src="https://raw.githubusercontent.com/sligara7/mapwright/main/docs/gallery/age-old.png" alt="old worn terrain"><br><sub><code>land_age=1</code> (old)</sub></td>
106
106
  </tr>
107
+ <tr>
108
+ <td align="center"><img width="240" src="https://raw.githubusercontent.com/sligara7/mapwright/main/docs/gallery/hint.png" alt="continent shaped by a caller-supplied elevation hint"><br><sub><code>elevation_hint=…</code></sub></td>
109
+ <td colspan="2" align="left"><sub>A continent whose macro shape is <b>art-directed</b> by a caller-supplied <code>elevation_hint</code> (a coarse painted land/elevation mask). The host (or an LLM) draws the shape; mapwright fills in organic coasts, erosion, rivers and climate — so maps need never look circular.</sub></td>
110
+ </tr>
107
111
  </table>
108
112
 
109
- The two right-hand maps above are the **same continent** at `land_age=0` (young, jagged,
113
+ The `land_age` pair above are the **same continent** at `land_age=0` (young, jagged,
110
114
  snow-capped peaks) vs `land_age=1` (old, worn down to rounded hills) — a mapwright-original
111
115
  "geological age" knob.
112
116
 
@@ -224,7 +228,7 @@ Settlement presets: `hamlet`, `village`, `town`, `city`, `port`, `citadel`.
224
228
  |-----------|--------------|
225
229
  | `SeededRNG` | One seed drives everything; `.derive(label)` yields independent, reproducible sub-streams (unifies stdlib + numpy). |
226
230
  | `NameGenerator` | Order-k character Markov names over hand-authored culture namebases; reproducible across processes. |
227
- | `RegionalTerrainGenerator` | Voronoi cells (Lloyd-relaxed) → **tectonic-plate** heightmap (organic coasts + mountain ranges at plate collisions; percentile sea level) → Planchon–Darboux depression fill → flux + hydraulic/creep erosion → rivers + inland lakes → latitude/elevation climate with **rain-shadow** → Whittaker biomes. |
231
+ | `RegionalTerrainGenerator` | Voronoi cells (Lloyd-relaxed) → **tectonic-plate** heightmap (organic coasts + mountain ranges at plate collisions; percentile sea level) → Planchon–Darboux depression fill → flux + hydraulic/creep erosion → rivers + inland lakes → latitude/elevation climate with **rain-shadow** → Whittaker biomes. Accepts a `template=` archetype or an `elevation_hint=` (caller-drawn macro shape). |
228
232
  | `compute_cell_polygons` | Reconstructs convex Voronoi polygons (half-plane clipping) for vector rendering. |
229
233
  | `RegionalSVGRenderer` | Shaded-relief (hillshade) SVG: biome polygons, coastline, rivers, roads, labelled markers. Takes a `theme=`. |
230
234
  | `Theme` / `THEMES` | A render palette + biome vocabulary; re-skins the same terrain — and its towns and dungeons — via one `theme=` (parchment / neon / dune / blueprint, or your own). The "Dominant Medium" layer. |
@@ -77,9 +77,13 @@ produced by [`examples/gallery.py`](examples/gallery.py):
77
77
  <td align="center"><img width="240" src="https://raw.githubusercontent.com/sligara7/mapwright/main/docs/gallery/age-young.png" alt="young jagged terrain"><br><sub><code>land_age=0</code> (young)</sub></td>
78
78
  <td align="center"><img width="240" src="https://raw.githubusercontent.com/sligara7/mapwright/main/docs/gallery/age-old.png" alt="old worn terrain"><br><sub><code>land_age=1</code> (old)</sub></td>
79
79
  </tr>
80
+ <tr>
81
+ <td align="center"><img width="240" src="https://raw.githubusercontent.com/sligara7/mapwright/main/docs/gallery/hint.png" alt="continent shaped by a caller-supplied elevation hint"><br><sub><code>elevation_hint=…</code></sub></td>
82
+ <td colspan="2" align="left"><sub>A continent whose macro shape is <b>art-directed</b> by a caller-supplied <code>elevation_hint</code> (a coarse painted land/elevation mask). The host (or an LLM) draws the shape; mapwright fills in organic coasts, erosion, rivers and climate — so maps need never look circular.</sub></td>
83
+ </tr>
80
84
  </table>
81
85
 
82
- The two right-hand maps above are the **same continent** at `land_age=0` (young, jagged,
86
+ The `land_age` pair above are the **same continent** at `land_age=0` (young, jagged,
83
87
  snow-capped peaks) vs `land_age=1` (old, worn down to rounded hills) — a mapwright-original
84
88
  "geological age" knob.
85
89
 
@@ -197,7 +201,7 @@ Settlement presets: `hamlet`, `village`, `town`, `city`, `port`, `citadel`.
197
201
  |-----------|--------------|
198
202
  | `SeededRNG` | One seed drives everything; `.derive(label)` yields independent, reproducible sub-streams (unifies stdlib + numpy). |
199
203
  | `NameGenerator` | Order-k character Markov names over hand-authored culture namebases; reproducible across processes. |
200
- | `RegionalTerrainGenerator` | Voronoi cells (Lloyd-relaxed) → **tectonic-plate** heightmap (organic coasts + mountain ranges at plate collisions; percentile sea level) → Planchon–Darboux depression fill → flux + hydraulic/creep erosion → rivers + inland lakes → latitude/elevation climate with **rain-shadow** → Whittaker biomes. |
204
+ | `RegionalTerrainGenerator` | Voronoi cells (Lloyd-relaxed) → **tectonic-plate** heightmap (organic coasts + mountain ranges at plate collisions; percentile sea level) → Planchon–Darboux depression fill → flux + hydraulic/creep erosion → rivers + inland lakes → latitude/elevation climate with **rain-shadow** → Whittaker biomes. Accepts a `template=` archetype or an `elevation_hint=` (caller-drawn macro shape). |
201
205
  | `compute_cell_polygons` | Reconstructs convex Voronoi polygons (half-plane clipping) for vector rendering. |
202
206
  | `RegionalSVGRenderer` | Shaded-relief (hillshade) SVG: biome polygons, coastline, rivers, roads, labelled markers. Takes a `theme=`. |
203
207
  | `Theme` / `THEMES` | A render palette + biome vocabulary; re-skins the same terrain — and its towns and dungeons — via one `theme=` (parchment / neon / dune / blueprint, or your own). The "Dominant Medium" layer. |
Binary file
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="576" height="396" viewBox="0 0 576 396"><rect width="576" height="396" fill="#183e56"/><g stroke-linejoin="round"><polygon points="0.0,0.0 19.7,0.0 17.4,20.7 0.0,20.6" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="19.7,0.0 41.3,0.0 42.2,18.0 21.3,24.4 17.4,20.7" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="41.3,0.0 65.8,0.0 66.7,18.2 47.2,22.1 42.2,18.0" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="65.8,0.0 90.3,0.0 88.1,19.4 67.0,22.6" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="90.3,0.0 112.7,0.0 109.2,22.1 94.2,24.1 88.1,19.4" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="112.7,0.0 130.8,0.0 134.2,27.0 108.6,25.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="130.8,0.0 154.0,0.0 155.4,17.6 134.7,27.5 134.2,27.0" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="154.0,0.0 175.5,0.0 175.5,20.0 165.7,23.8 155.4,17.6" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="175.5,0.0 194.7,0.0 195.8,20.2 186.2,23.4 175.5,20.0" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="194.7,0.0 220.5,0.0 222.1,12.3 202.7,23.3 195.8,20.2" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="220.5,0.0 252.1,0.0 245.4,14.4 222.2,13.2" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="252.1,0.0 259.9,0.0 273.0,21.6 249.3,24.1 245.4,14.4" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="259.9,0.0 285.0,0.0 283.5,18.5 273.9,23.0" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="285.0,0.0 309.2,0.0 310.6,11.9 294.7,22.4 283.5,18.5" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="309.2,0.0 338.5,0.0 336.1,11.0 316.5,15.9 310.6,11.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="338.5,0.0 359.7,0.0 362.0,20.3 355.5,24.0 342.7,22.3 336.1,11.0" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="359.7,0.0 384.4,0.0 384.3,14.6 373.7,23.3 362.0,20.3" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="384.4,0.0 413.0,0.0 413.1,1.8 404.3,20.4 401.8,21.9 384.3,14.6" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="404.3,20.4 413.1,1.8 432.2,19.1 426.5,30.1" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="413.0,0.0 443.1,0.0 441.1,14.9 432.2,19.1 413.1,1.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="443.1,0.0 464.4,0.0 467.3,14.5 464.1,19.2 452.9,22.7 441.1,14.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="464.4,0.0 491.6,0.0 489.2,14.5 467.3,14.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="491.6,0.0 519.7,0.0 520.7,6.6 511.4,22.2 491.3,18.2 489.2,14.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="530.3,37.9 510.6,23.5 520.7,6.6 535.5,15.3 535.5,33.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="519.7,0.0 551.1,0.0 549.9,9.8 535.5,15.3 520.7,6.6" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="551.1,0.0 576.0,0.0 576.0,19.1 549.0,16.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="0.0,44.2 0.0,20.6 17.4,20.7 21.3,24.4 22.6,42.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="22.5,41.2 21.3,24.4 42.2,18.0 47.2,22.1 47.2,36.4 35.1,44.0" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="47.2,36.4 47.2,22.1 71.6,17.2 70.0,37.9 60.9,45.7" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="70.0,37.9 71.2,21.9 88.1,19.4 94.2,24.1 91.3,47.7" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="91.2,48.6 94.2,24.1 114.7,21.4 110.6,43.8" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="120.0,51.3 110.6,43.8 113.9,25.8 134.2,27.0 135.7,28.3" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="134.2,27.8 155.4,17.6 165.7,23.8 164.2,37.2 154.3,44.6 144.1,41.9" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="164.2,37.2 165.7,23.8 175.5,20.0 186.2,23.4 183.8,45.8 180.3,47.6" fill="#ced7c5" stroke="#ced7c5" stroke-width="0.5"/><polygon points="183.8,45.8 186.2,23.4 195.8,20.2 202.7,23.3 206.5,35.3 199.2,48.8" fill="#c7cfbe" stroke="#c7cfbe" stroke-width="0.5"/><polygon points="206.5,35.3 202.7,23.3 222.9,11.9 230.3,41.3" fill="#d1c095" stroke="#d1c095" stroke-width="0.5"/><polygon points="229.6,38.8 223.2,13.2 245.4,14.4 249.3,24.1 246.6,33.5" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="246.6,33.5 249.3,24.1 275.1,21.4 272.8,40.8 256.1,44.2" fill="#c2cbba" stroke="#c2cbba" stroke-width="0.5"/><polygon points="272.8,41.3 275.0,22.5 283.5,18.5 294.7,22.4 300.4,39.3 291.4,46.3" fill="#bdc5b5" stroke="#bdc5b5" stroke-width="0.5"/><polygon points="300.4,39.3 294.7,22.4 310.6,11.9 316.5,15.9 319.9,30.9 310.7,42.0" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="319.9,30.9 316.5,15.9 336.1,11.0 342.7,22.3 334.7,33.0" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="342.7,22.3 355.5,24.0 355.5,49.9 350.0,52.2 338.7,48.4 334.7,33.0" fill="#cfbe94" stroke="#cfbe94" stroke-width="0.5"/><polygon points="355.5,49.9 355.5,24.0 362.0,20.3 373.7,23.3 377.1,34.1 363.3,51.3" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="377.1,34.1 373.7,23.3 384.3,14.6 401.8,21.9 398.8,39.6 393.4,43.5" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="398.8,39.6 401.8,21.9 404.3,20.4 426.5,30.1 427.2,37.4 418.5,45.4" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="427.2,37.4 426.5,30.1 432.2,19.1 441.1,14.9 452.9,22.7 449.8,41.9 445.5,45.4" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="449.8,41.9 452.9,22.7 464.1,19.2 478.6,44.6" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="474.6,37.6 464.1,19.2 467.3,14.5 489.2,14.5 491.3,18.2 486.5,33.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="491.3,18.2 513.3,22.6 500.8,47.7 486.5,33.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="509.5,52.5 501.7,45.8 512.2,24.8 530.3,37.9 529.4,42.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="535.5,33.8 535.5,15.3 560.4,5.8 550.1,33.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="556.1,17.5 576.0,19.1 576.0,38.5 555.5,39.4 550.1,33.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="0.0,67.0 0.0,44.2 20.8,42.9 19.3,60.6" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="19.3,60.6 21.0,40.9 35.1,44.0 42.9,61.6 38.0,68.9 28.6,69.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="42.9,61.6 35.1,44.0 47.3,36.4 60.9,45.7 60.3,56.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="60.3,56.9 60.9,45.7 70.0,37.9 91.8,47.9 90.8,56.0 67.5,64.5" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="90.6,57.9 91.7,48.5 110.6,43.8 120.0,51.3 123.5,62.6" fill="#fffec6" stroke="#fffec6" stroke-width="0.5"/><polygon points="122.3,58.8 120.0,51.3 135.1,29.1 144.1,41.9 132.7,62.2" fill="#e8f2de" stroke="#e8f2de" stroke-width="0.5"/><polygon points="132.7,62.2 144.1,41.9 154.3,44.6 158.8,60.2 151.7,67.8 134.3,64.4" fill="#e6f0dc" stroke="#e6f0dc" stroke-width="0.5"/><polygon points="158.8,60.2 154.3,44.6 164.2,37.2 180.3,47.6 174.7,61.5" fill="#dbe4d1" stroke="#dbe4d1" stroke-width="0.5"/><polygon points="176.6,65.0 174.7,61.5 180.3,47.6 183.8,45.8 199.2,48.8 205.5,61.5 196.7,70.0" fill="#ced7c6" stroke="#ced7c6" stroke-width="0.5"/><polygon points="205.5,61.5 199.2,48.8 206.5,35.3 228.2,40.7 227.9,49.4 210.7,62.3" fill="#6098b8" stroke="#6098b8" stroke-width="0.5"/><polygon points="227.9,49.4 228.3,39.3 246.6,33.5 256.1,44.2 252.8,55.8 238.0,59.2" fill="#c4ccbb" stroke="#c4ccbb" stroke-width="0.5"/><polygon points="252.8,55.8 256.1,44.2 273.4,40.7 273.4,64.9 260.7,66.4" fill="#d3dcca" stroke="#d3dcca" stroke-width="0.5"/><polygon points="273.4,41.4 291.4,46.3 291.4,60.5 273.4,67.2" fill="#b1b8a9" stroke="#b1b8a9" stroke-width="0.5"/><polygon points="291.4,60.5 291.4,46.3 300.4,39.3 310.7,42.0 314.3,48.9 307.5,66.8 302.7,69.0" fill="#b6beae" stroke="#b6beae" stroke-width="0.5"/><polygon points="327.7,74.4 307.5,66.8 314.3,48.9 329.9,53.2" fill="#a6ad9f" stroke="#a6ad9f" stroke-width="0.5"/><polygon points="310.7,42.0 319.9,30.9 334.7,33.0 338.7,48.4 329.9,53.2 314.3,48.9" fill="#aab1a2" stroke="#aab1a2" stroke-width="0.5"/><polygon points="363.3,51.3 377.1,34.1 393.4,43.5 391.7,51.7 369.9,57.8" fill="#c9b88f" stroke="#c9b88f" stroke-width="0.5"/><polygon points="372.0,74.5 369.9,57.8 391.7,51.7 393.5,56.0 381.1,77.5" fill="#8c9286" stroke="#8c9286" stroke-width="0.5"/><polygon points="393.5,56.0 391.7,51.7 393.4,43.5 398.8,39.6 418.5,45.4 418.5,63.2 404.7,65.1" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="418.5,63.2 418.5,45.4 427.2,37.4 445.5,45.4 445.5,58.6 435.9,65.6" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="445.5,58.6 445.5,45.4 449.8,41.9 470.8,43.9 474.7,58.9 461.9,68.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="474.7,58.9 469.6,39.3 486.5,33.5 498.5,45.5 482.3,60.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="499.9,44.2 509.5,52.5 510.9,65.9 488.8,69.4 482.3,60.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="510.9,65.8 509.5,52.5 529.4,42.5 538.7,59.6 533.2,67.2" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="538.7,59.6 529.4,42.5 530.3,37.9 535.5,33.8 550.1,33.8 555.5,39.4 550.6,58.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="576.0,38.5 576.0,59.3 550.2,60.4 555.5,39.4" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="0.0,75.9 0.0,67.0 19.3,60.6 28.6,69.5 19.0,85.0" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="21.4,93.6 19.0,85.0 28.6,69.5 38.0,68.9 46.5,83.4 33.2,96.1" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="46.5,83.4 38.0,68.9 42.9,61.6 60.3,56.9 67.5,64.5 67.5,73.4 52.9,85.0" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="67.5,73.4 67.5,64.5 91.8,55.6 95.8,77.7 91.1,84.1 79.6,84.2" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="95.8,77.7 92.3,58.2 118.0,61.9 111.1,77.5" fill="#edf7e3" stroke="#edf7e3" stroke-width="0.5"/><polygon points="111.1,77.5 119.8,57.9 132.7,62.2 134.3,64.4 131.2,81.5 118.7,85.8" fill="#f1fbe6" stroke="#f1fbe6" stroke-width="0.5"/><polygon points="131.2,81.5 134.3,64.4 151.7,67.8 155.2,82.4 150.3,87.3 137.0,86.4" fill="#c9c27e" stroke="#c9c27e" stroke-width="0.5"/><polygon points="155.2,82.4 151.7,67.8 158.8,60.2 174.7,61.5 176.6,65.0 172.9,81.7 168.7,84.9" fill="#c6bf7c" stroke="#c6bf7c" stroke-width="0.5"/><polygon points="172.9,81.7 176.6,65.0 196.7,70.0 195.6,88.2" fill="#b3ad70" stroke="#b3ad70" stroke-width="0.5"/><polygon points="195.7,86.6 196.7,70.0 205.5,61.5 210.7,62.3 222.9,79.0 215.5,92.1" fill="#b8b173" stroke="#b8b173" stroke-width="0.5"/><polygon points="222.9,79.0 210.7,62.3 227.9,49.4 238.0,59.2 235.5,76.7" fill="#b9b274" stroke="#b9b274" stroke-width="0.5"/><polygon points="235.0,80.0 238.0,59.2 252.8,55.8 260.7,66.4 255.6,77.1" fill="#b3ac70" stroke="#b3ac70" stroke-width="0.5"/><polygon points="255.7,77.0 260.7,66.4 275.4,64.7 280.7,84.3 262.5,87.9" fill="#908b5a" stroke="#908b5a" stroke-width="0.5"/><polygon points="281.7,88.0 275.8,66.3 291.4,60.5 302.7,69.0 300.1,78.1" fill="#7f7b50" stroke="#7f7b50" stroke-width="0.5"/><polygon points="312.2,93.2 300.1,78.1 302.7,69.0 307.5,66.8 333.6,76.6" fill="#7e8378" stroke="#7e8378" stroke-width="0.5"/><polygon points="338.7,48.4 350.0,52.2 346.8,74.9 333.8,80.0 327.3,77.6 329.9,53.2" fill="#a9b1a2" stroke="#a9b1a2" stroke-width="0.5"/><polygon points="346.8,74.9 350.0,52.2 355.5,49.9 363.3,51.3 369.9,57.8 372.0,74.5 360.8,81.3" fill="#9ba194" stroke="#9ba194" stroke-width="0.5"/><polygon points="380.5,78.7 393.5,56.0 404.7,65.1 398.0,79.9" fill="#888e82" stroke="#888e82" stroke-width="0.5"/><polygon points="398.0,79.9 404.7,65.1 418.5,63.2 418.5,85.5 402.2,85.5" fill="#baaa85" stroke="#baaa85" stroke-width="0.5"/><polygon points="418.5,87.7 418.5,63.2 435.9,65.6 438.3,86.3" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="438.3,86.3 435.9,65.6 445.5,58.6 461.9,68.9 461.8,76.7 442.1,89.1" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="461.8,76.7 461.9,68.9 474.7,58.9 482.3,60.9 488.8,69.4 487.3,86.8 470.5,86.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="487.4,85.9 488.8,69.4 510.8,66.0 510.8,83.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="510.8,85.6 510.8,65.8 533.2,67.2 534.9,79.9 527.8,88.0" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="534.9,79.9 533.2,67.2 538.7,59.6 552.5,58.7 557.8,87.7" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="576.0,59.3 576.0,82.9 557.1,83.8 552.8,60.3" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="0.0,104.5 0.0,75.9 19.0,85.0 21.4,93.6 11.7,104.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="42.7,113.9 33.2,96.1 46.5,83.4 52.9,85.0 60.2,100.7 46.0,114.5" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="60.2,100.7 52.9,85.0 67.5,73.4 79.6,84.2 69.2,101.9" fill="#ffffc6" stroke="#ffffc6" stroke-width="0.5"/><polygon points="69.2,101.9 79.6,84.2 91.1,84.1 95.9,96.8 87.2,109.9 76.3,110.0" fill="#65a65f" stroke="#65a65f" stroke-width="0.5"/><polygon points="95.9,96.8 91.1,84.1 95.8,77.7 111.1,77.5 118.7,85.8 116.5,97.2 110.7,101.1" fill="#eff9e5" stroke="#eff9e5" stroke-width="0.5"/><polygon points="116.5,97.2 118.7,85.8 131.2,81.5 137.0,86.4 132.3,105.2" fill="#cdc580" stroke="#cdc580" stroke-width="0.5"/><polygon points="132.1,105.9 137.0,86.4 150.3,87.3 151.0,107.3" fill="#ccc480" stroke="#ccc480" stroke-width="0.5"/><polygon points="150.9,106.0 150.3,87.3 155.2,82.4 168.7,84.9 171.9,105.3" fill="#ffffff" stroke="#ffffff" stroke-width="0.5"/><polygon points="171.9,105.3 168.7,84.9 172.9,81.7 194.1,87.7 188.7,102.3 172.9,106.0" fill="#ffffff" stroke="#ffffff" stroke-width="0.5"/><polygon points="188.7,102.3 194.6,86.3 215.5,92.1 218.7,102.6 207.6,113.0 198.6,113.2" fill="#e3e7eb" stroke="#e3e7eb" stroke-width="0.5"/><polygon points="218.7,102.6 215.5,92.1 222.9,79.0 238.9,76.1 242.7,102.0 227.5,106.2" fill="#ffffff" stroke="#ffffff" stroke-width="0.5"/><polygon points="242.7,102.0 239.4,79.4 255.7,77.1 262.5,87.9 258.8,99.2 247.6,104.1" fill="#79754c" stroke="#79754c" stroke-width="0.5"/><polygon points="258.8,99.2 262.5,87.9 283.7,83.7 285.3,94.6 271.7,107.3" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="285.3,94.6 284.2,86.6 300.1,78.1 312.2,93.2 310.9,102.3 294.0,102.5" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="310.8,102.7 312.2,93.2 330.7,78.9 333.8,80.0 339.2,102.2 330.8,108.6" fill="#7c8177" stroke="#7c8177" stroke-width="0.5"/><polygon points="339.2,102.2 333.8,80.0 346.8,74.9 360.7,81.3 360.7,100.8 353.2,105.3" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="372.0,74.5 382.5,78.0 382.5,101.6 374.6,105.4 360.7,100.7 360.7,81.3" fill="#8e9488" stroke="#8e9488" stroke-width="0.5"/><polygon points="382.5,101.6 382.5,78.8 398.0,79.9 402.2,85.5 397.4,104.8" fill="#8b9185" stroke="#8b9185" stroke-width="0.5"/><polygon points="396.5,108.4 402.2,85.5 420.9,85.5 417.8,105.4" fill="#477643" stroke="#477643" stroke-width="0.5"/><polygon points="417.8,105.4 420.5,87.6 438.3,86.3 442.1,89.1 444.2,99.2 423.4,109.7" fill="#4b7c46" stroke="#4b7c46" stroke-width="0.5"/><polygon points="444.7,101.6 442.1,89.1 461.8,76.7 470.5,86.8 463.6,104.7" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="463.6,104.7 470.5,86.8 486.7,86.8 489.7,98.8 483.8,109.7 472.0,113.4 468.4,111.6" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="489.7,98.8 486.5,86.0 512.9,83.6 507.9,103.7" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="507.9,103.7 512.4,85.8 527.8,88.0 531.0,100.9 512.4,112.2" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="531.0,100.9 527.8,88.0 534.9,79.9 553.9,86.4 553.2,90.2 540.0,105.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="576.0,82.9 576.0,111.5 564.5,109.1 553.2,90.2 554.3,84.0" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="0.0,136.0 0.0,104.5 11.7,104.8 20.0,120.6 3.7,136.1" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="20.0,120.6 11.7,104.8 21.4,93.6 33.2,96.1 42.7,113.9 28.2,122.6" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="46.0,114.5 60.2,100.7 69.2,101.9 76.3,110.0 68.6,129.2 53.0,124.2" fill="#62a25c" stroke="#62a25c" stroke-width="0.5"/><polygon points="68.7,128.9 76.3,110.0 87.2,109.9 94.6,120.0 85.7,132.3" fill="#65a65f" stroke="#65a65f" stroke-width="0.5"/><polygon points="94.6,120.0 87.2,109.9 95.9,96.8 110.7,101.1 110.4,118.7 105.9,122.3" fill="#65a65f" stroke="#65a65f" stroke-width="0.5"/><polygon points="110.4,118.7 110.7,101.1 116.5,97.2 133.1,105.5 126.9,121.6" fill="#cdc580" stroke="#cdc580" stroke-width="0.5"/><polygon points="126.9,121.6 132.9,106.0 149.7,107.2 150.7,126.5 132.1,130.2" fill="#ffffff" stroke="#ffffff" stroke-width="0.5"/><polygon points="150.7,126.5 149.6,106.0 171.9,105.3 172.9,106.0 173.3,121.9 155.0,129.5" fill="#ffffff" stroke="#ffffff" stroke-width="0.5"/><polygon points="173.4,123.4 172.9,106.0 188.7,102.3 198.6,113.2 190.4,126.2" fill="#b5b8bb" stroke="#b5b8bb" stroke-width="0.5"/><polygon points="207.6,113.0 218.7,102.6 227.5,106.2 230.7,129.1 217.5,137.7 216.6,137.3" fill="#9ea1a4" stroke="#9ea1a4" stroke-width="0.5"/><polygon points="230.7,129.1 227.5,106.2 242.7,102.0 247.6,104.1 251.0,120.9 243.4,130.8" fill="#9ea1a4" stroke="#9ea1a4" stroke-width="0.5"/><polygon points="251.0,120.9 247.6,104.1 258.8,99.2 271.7,107.3 275.1,124.7" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="274.6,121.8 271.7,107.3 285.3,94.6 294.0,102.5 287.6,120.9 283.1,123.5" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="287.6,120.9 294.0,102.5 311.4,102.3 307.8,123.0" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="307.8,123.0 311.3,102.9 330.8,108.6 330.8,127.3 318.7,131.2 311.6,129.4" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="330.8,127.3 330.8,108.6 339.2,102.2 353.2,105.3 353.2,126.5 335.5,130.0" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="353.3,131.7 353.3,105.3 360.7,100.7 374.6,105.4 375.8,127.6" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="375.8,127.6 374.6,105.4 382.5,101.6 400.3,105.5 398.8,123.3 378.8,129.6" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="398.8,123.3 400.1,107.9 417.8,105.4 423.4,109.7 427.2,125.9 425.0,129.2 405.1,130.2" fill="#355731" stroke="#355731" stroke-width="0.5"/><polygon points="427.2,125.9 423.4,109.7 447.6,97.6 443.5,123.6" fill="#457241" stroke="#457241" stroke-width="0.5"/><polygon points="443.5,123.6 446.9,101.9 463.6,104.7 468.4,111.6 450.4,128.1" fill="#457241" stroke="#457241" stroke-width="0.5"/><polygon points="474.4,127.6 472.0,113.4 483.8,109.7 498.4,123.6 490.1,136.3" fill="#bdad87" stroke="#bdad87" stroke-width="0.5"/><polygon points="483.8,109.7 489.7,98.8 507.9,103.7 512.4,112.2 511.6,119.3 498.4,123.6" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="511.6,119.3 512.4,112.2 531.0,100.9 540.0,105.9 544.2,116.6 542.8,122.5 517.6,125.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="544.2,116.6 540.0,105.9 553.2,90.2 564.5,109.1" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="564.5,109.1 576.0,111.5 576.0,127.9 560.9,131.0 543.2,120.5 544.2,116.6" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="3.7,136.1 20.0,120.6 28.2,122.6 33.0,143.6 17.2,148.1" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="33.0,143.6 28.2,122.6 42.7,113.9 46.0,114.5 53.0,124.2 41.2,147.7" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="40.3,149.6 53.0,124.2 68.4,129.1 66.5,147.8" fill="#5f9d59" stroke="#5f9d59" stroke-width="0.5"/><polygon points="66.3,149.4 68.4,128.9 85.7,132.3 91.2,143.4 88.1,149.4" fill="#6098b8" stroke="#6098b8" stroke-width="0.5"/><polygon points="91.2,143.4 85.7,132.3 94.6,120.0 105.9,122.3 107.1,139.7" fill="#c9c17d" stroke="#c9c17d" stroke-width="0.5"/><polygon points="107.1,139.7 105.9,122.3 110.4,118.7 126.9,121.6 132.1,130.2 128.4,141.3 111.5,143.1" fill="#c5be7b" stroke="#c5be7b" stroke-width="0.5"/><polygon points="128.4,141.3 132.1,130.2 150.7,126.5 155.0,129.5 157.4,142.7 153.5,149.1 131.8,146.9" fill="#ffffff" stroke="#ffffff" stroke-width="0.5"/><polygon points="157.4,142.7 155.0,129.5 175.5,121.0 175.5,145.0" fill="#acafb2" stroke="#acafb2" stroke-width="0.5"/><polygon points="175.5,146.2 175.5,123.8 190.4,126.2 196.6,139.9 194.2,143.2" fill="#9ea1a4" stroke="#9ea1a4" stroke-width="0.5"/><polygon points="196.6,139.9 190.4,126.2 198.6,113.2 207.6,113.0 216.6,137.3" fill="#9ea1a4" stroke="#9ea1a4" stroke-width="0.5"/><polygon points="221.3,149.9 217.5,137.7 230.7,129.1 243.4,130.8 250.1,145.0 243.7,158.2" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="250.1,145.0 243.4,130.8 251.0,120.9 271.1,124.0 265.3,143.1" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="265.3,143.1 272.0,121.3 283.1,123.5 291.5,145.3 290.5,147.0 275.0,152.1" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="291.5,145.3 283.1,123.5 287.6,120.9 307.8,123.0 311.6,129.4 300.1,142.8" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="321.6,154.9 318.7,131.2 330.8,127.3 335.5,130.0 338.2,148.7" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="338.2,148.7 335.5,130.0 359.1,125.3 357.3,145.3 344.0,152.0" fill="#8f8366" stroke="#8f8366" stroke-width="0.5"/><polygon points="357.3,145.3 358.6,130.7 375.8,127.6 378.8,129.6 381.9,145.1 371.7,156.5 370.5,156.4" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="381.9,145.1 378.8,129.6 398.8,123.3 405.1,130.2 400.9,150.1" fill="#8f8366" stroke="#8f8366" stroke-width="0.5"/><polygon points="400.8,150.1 405.1,130.2 425.0,129.2 428.0,143.9 418.6,154.4" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="428.0,143.9 425.0,129.2 427.2,125.9 443.5,123.6 450.4,128.1 455.3,139.5 445.7,150.4" fill="#8f8366" stroke="#8f8366" stroke-width="0.5"/><polygon points="468.4,111.6 472.0,113.4 474.4,127.6 460.9,140.1 455.3,139.5 450.4,128.1" fill="#497844" stroke="#497844" stroke-width="0.5"/><polygon points="474.4,127.6 490.1,136.3 490.4,140.5 470.7,149.2 460.9,140.1" fill="#4d7f48" stroke="#4d7f48" stroke-width="0.5"/><polygon points="490.4,140.5 490.1,136.3 498.4,123.6 511.6,119.3 517.6,125.5 518.4,142.3 504.4,152.0 496.1,148.4" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="518.4,142.3 517.6,125.5 541.1,122.7 541.1,149.3 535.9,151.6" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="541.1,119.2 560.9,131.0 553.6,146.6 541.1,151.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="576.0,127.9 576.0,152.6 553.6,146.6 560.9,131.0" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="0.0,167.6 0.0,136.0 3.7,136.1 17.2,148.1 13.7,165.3" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="13.7,165.3 17.2,148.1 33.0,143.6 42.5,148.4 42.1,156.8 36.9,164.6 18.5,169.2" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="42.1,156.8 42.4,149.5 67.8,147.7 68.4,169.0 64.0,174.7" fill="#578f52" stroke="#578f52" stroke-width="0.5"/><polygon points="68.4,169.0 67.8,149.4 88.1,149.4 93.6,166.6" fill="#5d9957" stroke="#5d9957" stroke-width="0.5"/><polygon points="94.4,168.9 88.1,149.4 91.2,143.4 107.1,139.7 111.5,143.1 108.2,165.1 102.4,169.2" fill="#c3bc7a" stroke="#c3bc7a" stroke-width="0.5"/><polygon points="108.2,165.1 111.5,143.1 128.4,141.3 131.8,146.9 129.8,166.2" fill="#b1aa6f" stroke="#b1aa6f" stroke-width="0.5"/><polygon points="129.8,165.6 131.8,146.9 153.5,149.1 155.0,158.9 146.9,168.5" fill="#928a80" stroke="#928a80" stroke-width="0.5"/><polygon points="155.0,158.9 153.5,149.1 157.4,142.7 176.8,145.1 174.7,166.6" fill="#ced1d5" stroke="#ced1d5" stroke-width="0.5"/><polygon points="174.7,166.6 176.7,146.0 194.2,143.3 198.1,170.4" fill="#5c5751" stroke="#5c5751" stroke-width="0.5"/><polygon points="197.4,165.5 194.2,143.2 196.6,139.9 216.6,137.3 217.5,137.7 221.3,149.9 211.8,166.3" fill="#546f46" stroke="#546f46" stroke-width="0.5"/><polygon points="211.8,166.3 221.3,149.9 243.7,158.2 244.8,162.6 238.5,170.7 217.0,173.8" fill="#546f46" stroke="#546f46" stroke-width="0.5"/><polygon points="244.8,162.6 243.7,158.2 250.1,145.0 265.3,143.1 275.0,152.1 271.2,166.4 258.7,170.3" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="271.2,166.4 275.0,152.1 290.5,147.0 297.1,164.4 285.2,178.6" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="297.1,164.4 290.5,147.0 291.5,145.3 300.1,142.8 319.3,158.0 317.6,167.1" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="300.1,142.8 311.6,129.4 318.7,131.2 322.3,160.3" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="317.5,167.7 319.7,155.6 338.2,148.7 344.0,152.0 345.8,164.8 335.2,174.6" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="345.8,164.8 344.0,152.0 357.3,145.3 370.5,156.4 356.3,168.3" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="371.7,156.5 381.9,145.1 400.9,150.1 396.1,166.5 378.4,166.5" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="396.1,166.5 400.9,150.1 418.6,154.4 422.0,167.0 402.3,177.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="422.0,167.0 418.6,154.4 428.0,143.9 445.7,150.4 446.4,157.1 439.4,166.3 424.6,168.6" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="446.4,157.1 445.7,150.4 455.3,139.5 460.9,140.1 470.7,149.2 472.1,169.0 467.4,170.5" fill="#d6c499" stroke="#d6c499" stroke-width="0.5"/><polygon points="472.1,169.1 470.7,149.2 490.4,140.5 496.1,148.4 478.6,168.4" fill="#609e5a" stroke="#609e5a" stroke-width="0.5"/><polygon points="496.1,148.4 504.4,152.0 506.9,162.1 495.6,176.3 478.6,168.4" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="506.9,162.1 504.4,152.0 518.4,142.3 535.9,151.6 531.7,162.3 516.1,167.4" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="547.6,182.9 536.4,174.5 531.7,162.3 535.9,151.6 543.6,148.3 555.6,166.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="576.0,152.6 576.0,163.9 555.6,166.8 544.7,150.1 553.6,146.6" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="0.0,191.1 0.0,167.6 13.7,165.3 18.5,169.2 21.6,184.5 16.4,193.1" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="21.6,184.5 18.5,169.2 36.9,164.6 42.6,184.5" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="42.2,183.2 36.9,164.6 42.1,156.8 64.3,174.9" fill="#548b4f" stroke="#548b4f" stroke-width="0.5"/><polygon points="63.9,174.8 68.4,169.0 98.2,166.2 84.5,192.6 68.2,184.9" fill="#a8a169" stroke="#a8a169" stroke-width="0.5"/><polygon points="88.1,200.6 84.5,192.6 96.8,169.0 102.4,169.2 112.3,189.0 96.2,202.8 92.8,203.2" fill="#898456" stroke="#898456" stroke-width="0.5"/><polygon points="112.3,189.0 102.4,169.2 108.2,165.1 129.2,166.1 128.1,185.3 117.5,190.2" fill="#96905e" stroke="#96905e" stroke-width="0.5"/><polygon points="128.1,185.3 129.3,165.5 146.9,168.5 151.5,181.7 139.2,191.1" fill="#706961" stroke="#706961" stroke-width="0.5"/><polygon points="151.5,181.7 146.9,168.5 155.0,158.9 174.7,166.6 165.5,186.3" fill="#5c5751" stroke="#5c5751" stroke-width="0.5"/><polygon points="165.5,186.3 174.7,166.6 192.2,169.4 193.3,192.0 175.5,193.9 166.7,188.8" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="193.4,193.5 192.0,165.3 211.8,166.3 217.0,173.8 217.0,183.9 212.7,191.5 205.7,194.7" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="217.0,183.9 217.0,173.8 238.5,170.7 238.5,188.5" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="238.5,188.5 238.5,170.7 244.8,162.6 258.7,170.3 257.8,188.8 241.8,193.9" fill="#546f46" stroke="#546f46" stroke-width="0.5"/><polygon points="257.8,188.8 258.7,170.3 271.2,166.4 285.2,178.6 285.8,181.8 282.9,189.3 269.2,196.7" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="285.8,181.8 285.2,178.6 297.1,164.4 318.2,167.2 311.1,185.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="313.0,192.1 311.1,185.8 317.9,167.9 335.2,174.6 339.7,188.1 334.2,198.7" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="339.7,188.1 335.2,174.6 345.8,164.8 356.3,168.3 361.8,186.2" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="361.8,186.2 356.3,168.3 370.5,156.4 371.7,156.5 378.4,166.5 373.8,187.0 365.7,188.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="374.2,185.5 378.4,166.5 396.1,166.5 402.3,177.9 401.6,182.6" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="401.1,186.1 402.3,177.9 422.0,167.0 424.6,168.6 427.9,188.1 425.3,190.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="427.9,188.1 424.6,168.6 439.4,166.3 447.6,186.7" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="446.0,182.7 439.4,166.3 446.4,157.1 467.4,170.5 461.0,178.6" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="482.5,199.5 472.4,169.1 478.6,168.4 495.6,176.3 497.0,181.0 486.8,199.8" fill="#558c50" stroke="#558c50" stroke-width="0.5"/><polygon points="497.0,181.0 495.6,176.3 506.9,162.1 516.1,167.4 518.0,188.7" fill="#8f8366" stroke="#8f8366" stroke-width="0.5"/><polygon points="517.7,185.1 516.1,167.4 531.7,162.3 536.4,174.5" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="536.4,174.5 548.6,183.7 547.8,185.6 528.3,196.6 516.3,187.6 515.9,186.1" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="576.0,163.9 576.0,187.4 546.6,184.8 555.6,166.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="0.0,220.3 0.0,191.1 16.4,193.1 19.5,200.6 6.5,219.3" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="19.5,200.6 16.4,193.1 21.6,184.5 41.4,184.5 45.0,202.5 32.0,206.9" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="45.0,202.5 41.2,183.5 64.0,175.0 68.2,184.9 57.1,202.4 46.0,203.0" fill="#4c7d47" stroke="#4c7d47" stroke-width="0.5"/><polygon points="57.1,202.4 68.2,184.9 84.5,192.6 88.1,200.6 69.0,213.2" fill="#467342" stroke="#467342" stroke-width="0.5"/><polygon points="96.2,202.8 112.3,189.0 117.5,190.2 122.8,208.6 112.8,213.6" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="122.8,208.6 117.5,190.2 128.1,185.3 139.2,191.1 140.3,199.4 127.5,210.0" fill="#6f6b45" stroke="#6f6b45" stroke-width="0.5"/><polygon points="140.3,199.4 139.2,191.1 151.5,181.7 165.5,186.3 166.7,188.8 154.6,207.7 152.4,208.3" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="154.6,207.7 166.7,188.8 175.5,193.9 175.5,218.8 172.3,219.2" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="175.5,218.8 175.5,193.9 195.6,191.8 191.2,213.7 178.5,220.1" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="211.3,216.9 205.7,194.7 212.7,191.5 229.5,205.8 220.1,218.5" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="212.7,191.5 217.0,183.9 238.5,188.5 241.8,193.9 238.7,203.3 229.5,205.8" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="238.7,203.3 241.8,193.9 257.8,188.8 269.2,196.7 266.9,214.1 247.4,214.1" fill="#8f8366" stroke="#8f8366" stroke-width="0.5"/><polygon points="267.4,210.6 269.2,196.7 282.9,189.3 294.5,204.4 288.8,217.8" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="282.9,189.3 285.8,181.8 311.1,185.8 313.0,192.1 306.5,202.4 294.5,204.4" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="314.6,217.1 306.5,202.4 313.0,192.1 341.2,200.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="331.5,203.8 339.7,188.1 361.8,186.2 365.7,188.5 359.0,211.2 358.4,211.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="359.0,211.2 365.7,188.5 372.5,187.2 384.6,203.7 380.1,219.5 377.3,220.7" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="384.6,203.7 371.4,185.8 404.2,182.3 400.6,198.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="400.6,198.9 403.3,186.5 425.2,190.9 425.2,213.9 420.0,214.4 407.7,210.0" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="425.2,212.4 425.2,190.9 427.9,188.1 443.1,187.0 449.1,202.6 444.0,211.0" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="449.1,202.6 441.9,183.8 461.0,178.6 465.4,199.7" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="465.4,199.7 461.0,178.6 467.4,170.5 472.3,168.9 482.5,199.5 472.4,203.2" fill="#fff9c2" stroke="#fff9c2" stroke-width="0.5"/><polygon points="485.4,202.5 497.0,181.0 516.0,188.0 505.2,204.8" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="516.3,187.6 528.3,196.6 529.6,211.5 510.2,211.5 505.2,204.8" fill="#8f8366" stroke="#8f8366" stroke-width="0.5"/><polygon points="529.6,211.5 528.3,196.6 547.8,185.6 552.7,211.5" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="576.0,187.4 576.0,209.9 552.7,211.5 547.8,185.6 548.1,184.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="6.5,219.3 19.5,200.6 32.0,206.9 28.2,227.7 25.8,229.4" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="28.2,227.7 32.0,206.9 45.0,202.5 46.0,203.0 49.0,229.5" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="48.9,229.2 46.0,203.0 57.1,202.4 69.0,213.2 68.3,227.6" fill="#b6a782" stroke="#b6a782" stroke-width="0.5"/><polygon points="68.4,227.1 69.0,213.2 88.1,200.6 92.8,203.2 92.0,229.8" fill="#4e8149" stroke="#4e8149" stroke-width="0.5"/><polygon points="92.0,229.1 92.8,203.2 96.2,202.8 112.8,213.6 110.2,231.8" fill="#365832" stroke="#365832" stroke-width="0.5"/><polygon points="110.6,229.5 112.8,213.6 122.8,208.6 127.5,210.0 134.6,224.2 131.0,229.5" fill="#6098b8" stroke="#6098b8" stroke-width="0.5"/><polygon points="134.6,224.2 127.5,210.0 140.3,199.4 152.4,208.3 145.1,222.8" fill="#6f6b46" stroke="#6f6b46" stroke-width="0.5"/><polygon points="156.9,234.6 145.1,222.8 152.4,208.2 154.6,207.7 172.3,219.2" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="183.5,232.6 178.5,220.1 191.2,213.8 204.2,220.2 199.9,237.6" fill="#6098b8" stroke="#6098b8" stroke-width="0.5"/><polygon points="191.2,213.8 195.3,193.6 205.7,194.7 211.3,216.9 204.3,220.2" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="220.1,218.5 229.5,205.8 238.7,203.3 247.4,214.1 240.5,232.5 224.1,226.8" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="240.5,232.5 247.4,214.1 263.9,214.1 266.3,232.9 247.7,239.2 243.1,237.9" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="270.4,235.7 266.3,232.9 263.3,209.3 293.5,219.3 290.2,225.8" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="286.3,223.7 294.5,204.4 306.5,202.4 314.6,217.1 312.9,225.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="312.4,228.5 314.6,217.1 336.0,204.1 336.0,226.3 330.7,230.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="336.0,226.3 336.0,205.1 358.4,211.5 350.5,228.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="354.3,236.5 350.5,228.8 358.4,211.5 359.0,211.2 377.3,220.7 371.2,237.7" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="380.1,219.5 384.6,203.7 400.6,198.9 407.7,210.0 391.9,223.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="402.0,239.7 391.9,223.5 407.7,210.0 420.0,214.4" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="428.5,231.6 422.9,212.5 444.0,211.0 452.3,223.7 445.7,237.7" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="452.3,223.7 444.0,211.0 449.1,202.6 465.4,199.7 472.4,203.2 468.4,222.9" fill="#fffbc4" stroke="#fffbc4" stroke-width="0.5"/><polygon points="468.4,222.9 472.4,203.2 482.5,199.5 490.5,200.2 490.5,229.5 474.3,229.5" fill="#65a65f" stroke="#65a65f" stroke-width="0.5"/><polygon points="490.5,228.1 490.5,203.1 505.2,204.8 510.2,211.5 506.5,226.1" fill="#375a33" stroke="#375a33" stroke-width="0.5"/><polygon points="506.5,226.1 510.2,211.5 529.6,211.5 527.8,232.3 514.0,232.8" fill="#8f8366" stroke="#8f8366" stroke-width="0.5"/><polygon points="527.8,232.3 529.6,211.5 552.6,211.5 550.2,232.9 540.3,236.5 530.2,234.5" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="576.0,209.9 576.0,236.5 553.5,234.9 550.2,232.9 552.7,211.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="0.0,246.8 0.0,220.3 6.5,219.3 25.8,229.4 22.0,248.3" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="21.9,248.9 25.8,229.4 28.2,227.7 48.7,229.4 46.7,251.0" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="46.7,251.0 48.7,229.3 67.8,227.7 68.8,245.9 49.8,254.4" fill="#c7b78e" stroke="#c7b78e" stroke-width="0.5"/><polygon points="68.8,245.9 67.8,227.1 91.1,229.7 87.7,251.5 78.2,253.8" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="87.7,251.5 91.2,229.0 108.4,231.5 112.1,250.1 93.7,255.1" fill="#59754a" stroke="#59754a" stroke-width="0.5"/><polygon points="111.8,248.4 108.0,229.5 131.0,229.5 134.2,249.4" fill="#6f935d" stroke="#6f935d" stroke-width="0.5"/><polygon points="134.0,248.4 131.0,229.5 134.6,224.2 145.1,222.8 156.9,234.6 157.4,246.3" fill="#9f9964" stroke="#9f9964" stroke-width="0.5"/><polygon points="157.4,247.0 156.9,234.6 172.3,219.2 175.5,218.8 178.5,220.1 183.5,232.6 173.4,248.5" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="180.4,256.0 173.4,248.5 183.5,232.6 202.5,238.4 196.1,253.4" fill="#7c784e" stroke="#7c784e" stroke-width="0.5"/><polygon points="199.3,240.2 204.2,220.3 211.3,216.9 220.1,218.5 224.1,226.8 214.2,242.0" fill="#6098b8" stroke="#6098b8" stroke-width="0.5"/><polygon points="214.2,242.0 224.1,226.8 240.5,232.5 243.1,237.9 234.0,250.3 220.5,250.1" fill="#3a6036" stroke="#3a6036" stroke-width="0.5"/><polygon points="247.7,239.2 266.3,232.9 270.4,235.7 274.0,247.8 259.2,258.7" fill="#467241" stroke="#467241" stroke-width="0.5"/><polygon points="274.0,247.8 270.4,235.7 290.2,225.8 293.5,246.1 283.3,252.3" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="293.5,246.1 290.2,225.8 291.1,224.1 315.3,226.2 309.6,249.6" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="309.9,248.5 314.7,228.8 330.7,230.9 336.2,249.9 331.7,253.6" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="336.2,249.9 330.7,230.9 336.0,226.3 350.5,228.8 354.3,236.5 346.0,249.9" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="346.0,249.9 354.3,236.5 371.2,237.7 375.3,246.2 371.4,254.0 355.1,260.2" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="375.3,246.2 371.2,237.7 377.3,220.7 380.1,219.5 391.9,223.5 402.0,239.7 402.7,245.3 397.0,248.4" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="402.7,245.3 402.0,239.7 420.0,214.4 423.3,214.1 428.5,231.6 417.2,246.7 412.0,249.4" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="417.2,246.7 428.5,231.6 445.7,237.7 450.0,253.3" fill="#fee9b5" stroke="#fee9b5" stroke-width="0.5"/><polygon points="448.4,247.5 445.7,237.7 452.3,223.7 468.4,222.9 474.3,229.5 467.7,247.5" fill="#65a65f" stroke="#65a65f" stroke-width="0.5"/><polygon points="467.7,247.5 474.3,229.5 489.0,229.5 493.7,247.3 487.1,254.2 473.0,254.2" fill="#63a45d" stroke="#63a45d" stroke-width="0.5"/><polygon points="493.7,247.3 488.7,228.3 506.5,226.1 514.0,232.8 506.6,249.4" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="511.3,255.8 506.6,249.4 514.0,232.8 527.8,232.3 530.2,234.5 523.6,257.8" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="544.1,264.1 540.3,236.5 550.2,232.9 553.5,234.9 555.9,253.7 549.9,262.2" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="576.0,236.5 576.0,248.6 555.9,253.7 553.5,234.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="0.0,272.6 0.0,246.8 22.5,248.3 22.5,270.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="22.5,272.2 22.5,249.0 46.7,251.0 49.8,254.4 50.8,262.8 46.1,272.2" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="50.8,262.8 49.8,254.4 68.8,245.9 78.2,253.8 72.7,267.7" fill="#ac9e7b" stroke="#ac9e7b" stroke-width="0.5"/><polygon points="72.7,267.7 78.2,253.8 87.7,251.5 93.7,255.1 96.1,272.4 76.0,277.4" fill="#658655" stroke="#658655" stroke-width="0.5"/><polygon points="96.1,272.4 93.7,255.1 110.2,250.6 115.0,272.2 102.6,276.9" fill="#416b3d" stroke="#416b3d" stroke-width="0.5"/><polygon points="115.0,272.2 109.7,248.4 133.1,249.4 132.7,264.5 120.9,273.8" fill="#4f824a" stroke="#4f824a" stroke-width="0.5"/><polygon points="132.7,264.5 133.2,248.5 158.3,246.2 155.6,272.4 151.4,275.2" fill="#bfb877" stroke="#bfb877" stroke-width="0.5"/><polygon points="155.6,272.4 158.2,247.1 173.4,248.5 180.4,256.0 178.2,277.3" fill="#a39d66" stroke="#a39d66" stroke-width="0.5"/><polygon points="178.8,271.1 180.4,256.0 196.1,253.4 204.5,266.7 194.2,276.2" fill="#948e5c" stroke="#948e5c" stroke-width="0.5"/><polygon points="204.5,266.7 196.1,253.4 201.7,240.5 214.2,242.0 220.5,250.1 213.2,267.7" fill="#3b6238" stroke="#3b6238" stroke-width="0.5"/><polygon points="213.2,267.7 220.5,250.1 234.0,250.3 239.5,265.6 220.9,276.0" fill="#457140" stroke="#457140" stroke-width="0.5"/><polygon points="239.5,265.6 234.0,250.3 243.1,237.9 247.7,239.2 259.2,258.7 257.8,264.0 246.5,268.4" fill="#457241" stroke="#457241" stroke-width="0.5"/><polygon points="257.8,264.0 259.2,258.7 274.0,247.8 283.3,252.3 285.2,269.6 269.2,274.1" fill="#4d7f48" stroke="#4d7f48" stroke-width="0.5"/><polygon points="285.2,269.5 283.3,252.3 293.5,246.1 308.7,249.4 307.0,265.0 288.4,271.6" fill="#4d7e48" stroke="#4d7e48" stroke-width="0.5"/><polygon points="307.0,265.0 308.8,248.3 331.7,253.6 329.6,272.7 315.9,274.3" fill="#477442" stroke="#477442" stroke-width="0.5"/><polygon points="329.8,271.0 331.7,253.6 336.2,249.9 346.0,249.9 355.1,260.2 353.8,271.9 350.1,274.3" fill="#5b9555" stroke="#5b9555" stroke-width="0.5"/><polygon points="353.8,271.9 355.1,260.2 371.4,254.0 379.8,273.0 366.9,279.1" fill="#599353" stroke="#599353" stroke-width="0.5"/><polygon points="379.8,273.0 371.4,254.0 375.3,246.2 397.0,248.4 388.7,275.0" fill="#578e51" stroke="#578e51" stroke-width="0.5"/><polygon points="388.7,275.0 397.0,248.4 402.7,245.3 412.0,249.4 416.1,261.7 406.8,282.4 402.7,283.5 393.8,280.9" fill="#5a9555" stroke="#5a9555" stroke-width="0.5"/><polygon points="416.1,261.7 412.0,249.4 417.2,246.7 445.5,252.4 444.5,260.2 435.8,268.5" fill="#5b9655" stroke="#5b9655" stroke-width="0.5"/><polygon points="444.5,260.2 446.1,247.5 467.7,247.5 473.0,254.2 468.4,271.8 463.8,275.1" fill="#63a35d" stroke="#63a35d" stroke-width="0.5"/><polygon points="468.4,271.8 473.0,254.2 487.1,254.2 496.1,278.7" fill="#b4ad70" stroke="#b4ad70" stroke-width="0.5"/><polygon points="493.9,272.7 487.1,254.2 493.7,247.3 506.6,249.4 511.3,255.8 502.0,271.6" fill="#375a34" stroke="#375a34" stroke-width="0.5"/><polygon points="516.8,283.0 502.0,271.6 511.3,255.8 523.6,257.8 529.1,263.7" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="523.6,257.8 530.2,234.5 540.3,236.5 544.3,265.7 529.1,263.7" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="576.0,248.6 576.0,271.7 549.9,262.2 555.9,253.7" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="0.0,288.0 0.0,272.6 23.8,270.6 23.0,294.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="23.0,293.3 23.8,272.2 46.1,272.2 51.0,284.8 40.5,296.6" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="51.0,284.8 46.1,272.2 50.9,262.8 72.7,267.7 74.5,272.9 55.4,286.0" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="55.4,286.0 78.5,270.1 79.8,289.0 66.7,297.6" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="79.8,289.0 79.0,276.7 96.1,272.4 102.6,276.9 100.7,293.4 94.5,298.3" fill="#3a5f36" stroke="#3a5f36" stroke-width="0.5"/><polygon points="100.7,293.4 102.6,276.9 115.0,272.2 120.9,273.8 125.7,285.6 117.9,298.1" fill="#395e36" stroke="#395e36" stroke-width="0.5"/><polygon points="125.7,285.6 120.9,273.8 132.7,264.5 151.4,275.2 147.8,286.1 142.0,289.4" fill="#426d3e" stroke="#426d3e" stroke-width="0.5"/><polygon points="147.8,286.1 151.4,275.2 155.6,272.4 172.4,276.0 175.7,297.2 173.8,300.1 166.1,302.1 163.1,301.5" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="175.7,297.2 171.2,268.6 194.2,276.2 196.4,291.8" fill="#736e48" stroke="#736e48" stroke-width="0.5"/><polygon points="196.4,291.8 194.2,276.2 204.5,266.7 213.2,267.7 220.9,276.0 221.2,282.1 201.2,294.8" fill="#918c5b" stroke="#918c5b" stroke-width="0.5"/><polygon points="221.2,282.1 220.9,276.0 239.5,265.6 246.5,268.4 246.5,292.5 230.2,292.5" fill="#a09a64" stroke="#a09a64" stroke-width="0.5"/><polygon points="246.5,291.3 246.5,268.4 257.8,264.0 269.2,274.1 265.6,291.9" fill="#52874d" stroke="#52874d" stroke-width="0.5"/><polygon points="266.0,289.8 269.2,274.1 285.2,269.6 288.4,271.6 292.6,287.4 284.2,294.4" fill="#a09a64" stroke="#a09a64" stroke-width="0.5"/><polygon points="292.6,287.4 288.4,271.6 307.0,265.0 315.9,274.3 309.0,289.3 304.1,291.4" fill="#4f814a" stroke="#4f814a" stroke-width="0.5"/><polygon points="309.0,289.3 315.9,274.3 327.7,273.0 333.8,295.4 328.1,300.4" fill="#5b9656" stroke="#5b9656" stroke-width="0.5"/><polygon points="333.8,295.4 327.0,270.6 350.1,274.3 345.2,294.5" fill="#558d50" stroke="#558d50" stroke-width="0.5"/><polygon points="345.2,294.5 350.1,274.3 353.8,271.9 366.9,279.1 366.3,297.4 357.8,303.4" fill="#619f5b" stroke="#619f5b" stroke-width="0.5"/><polygon points="366.3,297.4 366.9,279.1 379.8,273.0 388.7,275.0 393.8,280.9 379.7,299.3" fill="#579052" stroke="#579052" stroke-width="0.5"/><polygon points="425.2,305.3 406.6,282.4 438.8,282.4" fill="#c4bd7b" stroke="#c4bd7b" stroke-width="0.5"/><polygon points="406.8,282.4 416.1,261.7 435.8,268.5 435.3,282.4" fill="#5f9c59" stroke="#5f9c59" stroke-width="0.5"/><polygon points="435.3,284.7 435.8,268.5 444.5,260.2 463.8,275.1 462.1,281.2 446.2,288.5" fill="#cdc580" stroke="#cdc580" stroke-width="0.5"/><polygon points="462.1,281.2 463.8,275.1 468.4,271.8 489.8,277.1 489.4,290.0 470.5,294.7" fill="#bbb475" stroke="#bbb475" stroke-width="0.5"/><polygon points="489.3,291.1 490.0,273.3 502.0,271.6 516.8,283.0 518.0,289.4 510.8,294.5" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="518.0,289.4 516.8,283.0 529.1,263.7 542.6,265.5 545.0,279.8 526.5,293.6" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="530.2,300.8 526.5,293.6 545.0,279.8 553.6,287.1 550.8,303.0" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="576.0,271.7 576.0,282.6 553.6,287.1 545.0,279.8 542.5,264.7 549.9,262.2" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="0.0,310.9 0.0,288.0 21.6,294.5 15.7,311.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="16.0,310.9 22.0,293.1 40.5,296.6 46.1,313.4 44.8,315.8 34.1,320.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="46.1,313.4 40.5,296.6 51.0,284.8 55.4,286.0 66.7,297.6 66.3,308.6" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="66.2,309.5 66.7,297.6 79.8,289.0 94.5,298.3 93.8,302.1 82.4,312.2" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="93.8,302.1 94.5,298.3 100.7,293.4 117.9,298.1 122.8,310.5 114.1,321.4 107.7,320.6" fill="#8f8366" stroke="#8f8366" stroke-width="0.5"/><polygon points="122.8,310.5 117.9,298.1 125.7,285.6 142.0,289.4 137.7,306.5 129.8,310.5" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="137.7,306.5 142.0,289.4 147.7,286.1 163.1,301.5 148.3,311.4" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="151.5,328.9 148.3,311.4 163.1,301.5 166.1,302.1 162.1,331.7 159.6,332.9" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="173.8,300.1 175.7,297.2 196.4,291.8 201.2,294.8 205.7,309.7 192.6,318.0 183.7,315.8" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="205.7,309.7 201.2,294.8 221.2,282.1 230.2,292.5 223.1,308.8 211.5,312.2" fill="#757049" stroke="#757049" stroke-width="0.5"/><polygon points="223.1,308.8 230.2,292.5 244.9,292.5 247.6,320.9 240.4,322.5" fill="#a29c65" stroke="#a29c65" stroke-width="0.5"/><polygon points="247.3,317.8 244.8,291.2 263.5,291.9 266.2,310.7" fill="#beb777" stroke="#beb777" stroke-width="0.5"/><polygon points="266.2,310.7 263.1,289.1 284.2,294.4 284.2,310.6 273.6,314.9" fill="#b3ad70" stroke="#b3ad70" stroke-width="0.5"/><polygon points="284.2,310.6 284.2,294.4 292.6,287.4 304.1,291.4 303.1,313.2 302.7,313.6 295.1,315.7" fill="#beb777" stroke="#beb777" stroke-width="0.5"/><polygon points="303.1,313.2 304.1,291.4 309.0,289.3 328.1,300.4 326.6,307.9" fill="#bcb576" stroke="#bcb576" stroke-width="0.5"/><polygon points="326.6,307.9 328.1,300.4 333.8,295.4 345.2,294.5 357.8,303.4 357.1,311.1 353.8,316.5 332.7,321.6" fill="#bfb878" stroke="#bfb878" stroke-width="0.5"/><polygon points="357.1,311.1 357.8,303.4 366.3,297.4 379.7,299.3 389.7,315.5 382.7,323.0" fill="#b3ac70" stroke="#b3ac70" stroke-width="0.5"/><polygon points="389.8,315.8 379.7,299.3 393.8,280.9 402.7,283.5 401.2,307.6" fill="#b9b273" stroke="#b9b273" stroke-width="0.5"/><polygon points="401.2,307.6 402.7,283.5 406.7,282.4 425.2,305.3 425.2,307.9 419.6,311.7" fill="#c2bb79" stroke="#c2bb79" stroke-width="0.5"/><polygon points="425.2,307.9 425.2,305.3 437.1,285.3 446.2,288.5 451.0,307.6 438.5,314.5" fill="#77734b" stroke="#77734b" stroke-width="0.5"/><polygon points="451.0,307.6 446.2,288.5 462.1,281.2 470.5,294.7 467.7,305.6 462.0,310.3" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="467.7,305.6 470.5,294.7 490.5,289.7 490.5,313.8" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="490.5,310.5 490.5,291.3 510.8,294.5 506.8,310.5" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="506.8,310.5 510.8,294.5 518.0,289.4 526.5,293.6 530.2,300.8 527.2,315.8 512.2,317.6" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="532.6,321.9 527.2,315.8 530.2,300.8 550.8,303.0 555.3,310.5 551.2,317.2" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="576.0,282.6 576.0,310.5 555.3,310.5 550.8,303.0 553.6,287.1" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="0.0,339.9 0.0,310.9 14.4,311.8 11.8,337.0 5.7,340.4" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="11.8,337.0 14.6,310.1 34.1,320.5 29.0,338.7" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="44.8,315.8 46.1,313.4 67.5,308.3 67.5,334.8 62.1,340.2 56.4,337.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="67.5,334.8 67.5,309.7 82.4,312.2 87.9,330.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="87.9,330.5 82.4,312.2 93.8,302.1 107.7,320.6 89.7,331.4" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="115.0,323.4 114.1,321.4 122.8,310.5 129.7,310.5 141.0,330.2 133.5,335.8" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="129.8,310.5 137.7,306.5 148.3,311.4 151.5,328.9 141.0,330.2" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="162.1,331.7 166.1,302.1 173.8,300.1 183.7,315.8 170.1,331.4" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="170.1,331.4 183.7,315.8 192.6,318.0 195.0,334.5 182.9,340.6" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="195.0,334.5 192.6,318.0 205.7,309.7 211.5,312.2 215.7,338.1 206.2,339.9" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="214.9,333.0 211.5,312.2 223.1,308.8 240.4,322.5 231.7,333.3" fill="#7a764c" stroke="#7a764c" stroke-width="0.5"/><polygon points="243.1,319.4 266.2,310.7 273.6,314.9 272.3,332.6 258.7,336.9" fill="#948f5d" stroke="#948f5d" stroke-width="0.5"/><polygon points="272.3,332.6 273.6,314.9 284.2,310.6 295.1,315.7 290.1,336.0 283.5,339.3" fill="#a39d66" stroke="#a39d66" stroke-width="0.5"/><polygon points="290.1,336.0 295.1,315.7 302.7,313.6 313.2,329.8 305.8,340.6" fill="#b8b173" stroke="#b8b173" stroke-width="0.5"/><polygon points="313.2,329.8 302.7,313.6 303.1,313.2 326.6,307.9 332.7,321.6 330.1,328.4" fill="#c1ba79" stroke="#c1ba79" stroke-width="0.5"/><polygon points="333.0,336.3 330.1,328.4 332.7,321.6 353.8,316.5 359.1,334.9 346.4,343.3" fill="#726d47" stroke="#726d47" stroke-width="0.5"/><polygon points="359.1,334.9 353.8,316.5 357.1,311.1 382.7,323.0 381.7,327.2 368.7,338.2" fill="#858053" stroke="#858053" stroke-width="0.5"/><polygon points="396.1,345.2 381.7,327.2 382.7,323.0 390.0,315.1 409.1,331.5" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="409.1,331.5 390.3,315.4 401.2,307.6 419.6,311.7 414.7,330.8" fill="#7d784e" stroke="#7d784e" stroke-width="0.5"/><polygon points="414.7,330.8 419.6,311.7 425.2,307.9 438.5,314.5 439.9,327.8 426.1,340.4" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="439.9,327.8 438.5,314.5 451.0,307.6 462.0,310.3 464.9,328.3 460.2,335.8 458.2,336.2" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="464.9,328.3 462.0,310.3 467.7,305.6 488.1,312.9 486.9,326.9" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="486.6,330.8 488.3,310.5 506.8,310.5 512.2,317.6 507.0,330.8" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="507.0,330.8 512.2,317.6 527.2,315.8 532.6,321.9 532.2,331.3 512.6,338.7" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="532.2,331.3 532.6,321.9 551.2,317.2 556.5,338.1 538.3,339.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="576.0,310.5 576.0,338.0 556.6,338.6 551.2,317.2 555.3,310.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="14.8,364.8 5.7,340.4 11.8,337.0 29.0,338.7 32.7,343.4 33.0,360.5 24.6,367.1" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="32.7,343.4 29.0,338.7 34.1,320.5 44.8,315.8 56.4,337.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="33.0,360.5 32.7,343.4 56.4,337.5 62.1,340.2 63.4,346.9 47.3,363.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="63.4,346.9 62.1,340.2 67.5,334.8 87.9,330.5 89.7,331.4 96.2,350.7 89.8,359.1 78.5,360.1" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="96.2,350.7 89.7,331.4 107.7,320.6 114.1,321.4 115.0,323.4 110.9,348.9" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="110.9,348.9 115.0,323.4 133.5,335.8 129.5,355.9 126.4,356.7" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="129.5,355.9 133.5,335.8 141.0,330.2 151.5,328.9 159.6,332.9 158.2,342.6 136.8,358.6" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="158.2,342.6 159.6,332.9 162.1,331.7 170.1,331.4 182.9,340.6 182.4,360.0 174.7,364.4 170.6,363.1" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="182.4,360.0 182.9,340.6 195.0,334.5 206.2,339.9 195.2,361.9" fill="#7c8177" stroke="#7c8177" stroke-width="0.5"/><polygon points="202.4,368.3 195.2,361.9 206.2,339.9 209.2,339.3 223.4,359.8 219.0,365.1" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="223.4,359.8 204.7,332.9 231.7,333.3 237.0,355.9" fill="#7c8177" stroke="#7c8177" stroke-width="0.5"/><polygon points="237.5,358.5 231.7,333.3 240.4,322.5 245.0,321.4 258.7,336.9 253.7,354.2" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="253.7,354.2 258.7,336.9 272.3,332.6 283.5,339.3 282.0,359.1 267.5,363.5" fill="#7c8177" stroke="#7c8177" stroke-width="0.5"/><polygon points="282.0,359.1 283.5,339.3 290.1,336.0 305.8,340.6 310.6,353.8 302.0,361.8 289.7,363.7" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="310.6,353.8 305.8,340.6 313.2,329.8 330.1,328.4 333.0,336.3 321.0,355.1" fill="#9ea1a4" stroke="#9ea1a4" stroke-width="0.5"/><polygon points="321.0,355.1 333.0,336.3 346.4,343.3 348.8,364.6 330.4,365.8" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="348.7,364.0 346.4,343.3 359.1,334.9 368.7,338.2 373.6,356.5" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="373.6,356.5 368.7,338.2 381.7,327.2 396.1,345.2 395.1,356.9 379.5,359.8" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="395.1,356.9 396.1,345.2 409.1,331.5 414.7,330.8 426.1,340.4 426.3,342.7 415.0,359.3 400.7,360.8" fill="#7c8177" stroke="#7c8177" stroke-width="0.5"/><polygon points="426.3,342.7 426.1,340.4 439.9,327.8 458.2,336.2 443.7,354.3" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="445.8,363.7 443.7,354.3 458.2,336.2 460.2,335.8 472.9,352.3 463.2,368.6" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="472.9,352.3 460.2,335.8 464.9,328.3 490.9,326.6 486.0,351.0" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="486.0,351.0 490.0,330.8 507.0,330.8 512.6,338.7 512.6,346.9 498.4,361.1" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="512.6,346.9 512.6,338.7 532.2,331.3 538.3,339.8 532.3,355.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="534.5,361.9 532.3,355.8 538.3,339.8 557.3,338.0 551.9,367.7" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="576.0,338.0 576.0,365.9 552.4,365.0 557.2,338.6" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="0.0,371.2 0.0,339.9 5.7,340.4 14.8,364.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="61.4,396.0 28.4,396.0 24.6,367.1 33.0,360.5 47.3,363.9 61.4,388.3" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="61.4,388.3 47.3,363.9 63.4,346.9 78.5,360.1" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="108.4,396.0 61.4,396.0 61.4,388.3 78.5,360.1 89.8,359.1" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="107.5,394.4 89.8,359.1 96.2,350.7 110.9,348.9 126.4,356.7" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="145.5,396.0 106.7,396.0 126.4,356.7 129.5,355.9 136.8,358.6 147.2,370.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="147.2,370.9 136.8,358.6 158.2,342.6 170.6,363.1" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="176.8,396.0 145.5,396.0 147.2,370.9 170.6,363.1 174.7,364.4" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="198.9,396.0 176.8,396.0 174.7,364.4 182.4,360.0 195.2,361.9 202.4,368.3" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="228.8,396.0 198.9,396.0 202.4,368.3 219.0,365.1" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="243.6,396.0 228.8,396.0 219.0,365.1 223.4,359.8 241.2,354.7" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="262.6,396.0 243.6,396.0 241.4,357.5 253.7,354.2 267.5,363.5" fill="#8f8366" stroke="#8f8366" stroke-width="0.5"/><polygon points="289.2,396.0 262.6,396.0 267.5,363.5 282.0,359.1 289.7,363.7" fill="#7c8177" stroke="#7c8177" stroke-width="0.5"/><polygon points="319.1,396.0 289.2,396.0 289.7,363.7 302.0,361.8" fill="#7c8177" stroke="#7c8177" stroke-width="0.5"/><polygon points="317.5,392.7 302.0,361.8 310.6,353.8 321.0,355.1 330.4,365.8" fill="#7c8177" stroke="#7c8177" stroke-width="0.5"/><polygon points="357.6,396.0 315.9,396.0 330.4,365.8 348.4,364.6" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="373.5,396.0 357.6,396.0 348.2,364.2 373.6,356.5 379.5,359.8" fill="#7c8177" stroke="#7c8177" stroke-width="0.5"/><polygon points="401.5,396.0 373.5,396.0 379.5,359.8 395.1,356.9 400.7,360.8" fill="#8f8366" stroke="#8f8366" stroke-width="0.5"/><polygon points="429.2,396.0 401.5,396.0 400.7,360.8 415.0,359.3 431.6,377.0" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="431.6,377.0 415.0,359.3 426.3,342.7 443.7,354.3 445.8,363.7" fill="#7c8177" stroke="#7c8177" stroke-width="0.5"/><polygon points="475.4,396.0 429.2,396.0 431.6,377.0 445.8,363.7 463.2,368.6" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="475.3,395.8 463.2,368.6 472.9,352.3 486.0,351.0 498.4,361.1 498.4,361.1" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="519.4,396.0 475.2,396.0 498.4,361.1 518.8,377.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="518.8,377.9 498.4,361.1 498.4,361.1 512.6,346.9 532.3,355.8 534.5,361.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="550.2,396.0 519.4,396.0 518.8,377.9 534.5,361.9 549.2,366.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="576.0,365.9 576.0,396.0 550.2,396.0 549.2,364.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="28.4,396.0 0.0,396.0 0.0,371.2 14.8,364.8 24.6,367.1" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/></g><path d="M164.2,37.2 L165.7,23.8 M165.7,23.8 L175.5,20.0 M175.5,20.0 L186.2,23.4 M186.2,23.4 L195.8,20.2 M195.8,20.2 L202.7,23.3 M202.7,23.3 L222.9,11.9 M222.9,11.9 L230.3,41.3 M246.6,33.5 L249.3,24.1 M249.3,24.1 L275.1,21.4 M275.0,22.5 L283.5,18.5 M283.5,18.5 L294.7,22.4 M294.7,22.4 L300.4,39.3 M342.7,22.3 L355.5,24.0 M355.5,24.0 L355.5,49.9 M334.7,33.0 L342.7,22.3 M90.6,57.9 L91.7,48.5 M91.7,48.5 L110.6,43.8 M110.6,43.8 L120.0,51.3 M120.0,51.3 L135.1,29.1 M135.1,29.1 L144.1,41.9 M144.1,41.9 L154.3,44.6 M154.3,44.6 L164.2,37.2 M228.3,39.3 L246.6,33.5 M300.4,39.3 L310.7,42.0 M310.7,42.0 L319.9,30.9 M319.9,30.9 L334.7,33.0 M363.3,51.3 L377.1,34.1 M377.1,34.1 L393.4,43.5 M393.4,43.5 L391.7,51.7 M391.7,51.7 L393.5,56.0 M95.8,77.7 L92.3,58.2 M355.5,49.9 L363.3,51.3 M393.5,56.0 L404.7,65.1 M404.7,65.1 L418.5,63.2 M418.5,63.2 L418.5,85.5 M60.2,100.7 L52.9,85.0 M52.9,85.0 L67.5,73.4 M67.5,73.4 L79.6,84.2 M79.6,84.2 L91.1,84.1 M91.1,84.1 L95.8,77.7 M420.5,87.6 L438.3,86.3 M438.3,86.3 L442.1,89.1 M442.1,89.1 L444.2,99.2 M46.0,114.5 L60.2,100.7 M53.0,124.2 L46.0,114.5 M330.8,127.3 L318.7,131.2 M335.5,130.0 L330.8,127.3 M375.8,127.6 L353.3,131.7 M378.8,129.6 L375.8,127.6 M425.0,129.2 L405.1,130.2 M446.9,101.9 L463.6,104.7 M463.6,104.7 L468.4,111.6 M472.0,113.4 L483.8,109.7 M483.8,109.7 L498.4,123.6 M498.4,123.6 L490.1,136.3 M40.3,149.6 L53.0,124.2 M291.5,145.3 L290.5,147.0 M290.5,147.0 L275.0,152.1 M300.1,142.8 L291.5,145.3 M338.2,148.7 L335.5,130.0 M359.1,125.3 L357.3,145.3 M357.3,145.3 L344.0,152.0 M344.0,152.0 L338.2,148.7 M381.9,145.1 L378.8,129.6 M405.1,130.2 L400.9,150.1 M400.9,150.1 L381.9,145.1 M428.0,143.9 L425.0,129.2 M445.7,150.4 L428.0,143.9 M468.4,111.6 L472.0,113.4 M490.1,136.3 L490.4,140.5 M42.1,156.8 L42.4,149.5 M275.0,152.1 L271.2,166.4 M271.2,166.4 L258.7,170.3 M318.7,131.2 L322.3,160.3 M322.3,160.3 L300.1,142.8 M446.4,157.1 L445.7,150.4 M467.4,170.5 L446.4,157.1 M490.4,140.5 L496.1,148.4 M496.1,148.4 L504.4,152.0 M504.4,152.0 L506.9,162.1 M42.2,183.2 L36.9,164.6 M36.9,164.6 L42.1,156.8 M258.7,170.3 L257.8,188.8 M506.9,162.1 L516.1,167.4 M516.1,167.4 L518.0,188.7 M45.0,202.5 L41.2,183.5 M46.0,203.0 L45.0,202.5 M257.8,188.8 L269.2,196.7 M269.2,196.7 L266.9,214.1 M266.9,214.1 L247.4,214.1 M465.4,199.7 L461.0,178.6 M461.0,178.6 L467.4,170.5 M516.3,187.6 L528.3,196.6 M528.3,196.6 L529.6,211.5 M48.9,229.2 L46.0,203.0 M247.4,214.1 L240.5,232.5 M452.3,223.7 L444.0,211.0 M444.0,211.0 L449.1,202.6 M449.1,202.6 L465.4,199.7 M529.6,211.5 L527.8,232.3 M46.7,251.0 L48.7,229.3 M49.8,254.4 L46.7,251.0 M240.5,232.5 L243.1,237.9 M247.7,239.2 L266.3,232.9 M266.3,232.9 L270.4,235.7 M270.4,235.7 L274.0,247.8 M417.2,246.7 L428.5,231.6 M428.5,231.6 L445.7,237.7 M445.7,237.7 L452.3,223.7 M527.8,232.3 L530.2,234.5 M530.2,234.5 L523.6,257.8 M50.8,262.8 L49.8,254.4 M72.7,267.7 L50.8,262.8 M76.0,277.4 L72.7,267.7 M243.1,237.9 L247.7,239.2 M274.0,247.8 L283.3,252.3 M283.3,252.3 L293.5,246.1 M293.5,246.1 L308.7,249.4 M308.8,248.3 L331.7,253.6 M331.7,253.6 L336.2,249.9 M336.2,249.9 L346.0,249.9 M346.0,249.9 L355.1,260.2 M355.1,260.2 L371.4,254.0 M371.4,254.0 L375.3,246.2 M375.3,246.2 L397.0,248.4 M397.0,248.4 L402.7,245.3 M402.7,245.3 L412.0,249.4 M412.0,249.4 L417.2,246.7 M523.6,257.8 L529.1,263.7 M79.8,289.0 L79.0,276.7 M94.5,298.3 L79.8,289.0 M529.1,263.7 L542.6,265.5 M542.6,265.5 L545.0,279.8 M545.0,279.8 L526.5,293.6 M93.8,302.1 L94.5,298.3 M114.1,321.4 L107.7,320.6 M107.7,320.6 L93.8,302.1 M159.6,332.9 L151.5,328.9 M526.5,293.6 L530.2,300.8 M530.2,300.8 L527.2,315.8 M527.2,315.8 L512.2,317.6 M115.0,323.4 L114.1,321.4 M141.0,330.2 L133.5,335.8 M133.5,335.8 L115.0,323.4 M151.5,328.9 L141.0,330.2 M512.2,317.6 L507.0,330.8 M507.0,330.8 L486.6,330.8 M158.2,342.6 L159.6,332.9 M182.4,360.0 L174.7,364.4 M174.7,364.4 L170.6,363.1 M170.6,363.1 L158.2,342.6 M195.2,361.9 L182.4,360.0 M202.4,368.3 L195.2,361.9 M223.4,359.8 L219.0,365.1 M219.0,365.1 L202.4,368.3 M237.0,355.9 L223.4,359.8 M348.8,364.6 L330.4,365.8 M415.0,359.3 L400.7,360.8 M472.9,352.3 L463.2,368.6 M463.2,368.6 L445.8,363.7 M490.9,326.6 L486.0,351.0 M486.0,351.0 L472.9,352.3 M243.6,396.0 L241.4,357.5 M330.4,365.8 L317.5,392.7 M357.6,396.0 L348.2,364.2 M400.7,360.8 L401.5,396.0 M431.6,377.0 L415.0,359.3 M445.8,363.7 L431.6,377.0" fill="none" stroke="#283640" stroke-width="2.0" stroke-linecap="round"/><g opacity="0.9"><path d="M99.0,243.0 L85.5,265.5" fill="none" stroke="#4a82af" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/><path d="M121.5,238.5 L99.0,243.0" fill="none" stroke="#4a82af" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/><path d="M227.2,164.2 L247.5,180.0" fill="none" stroke="#4a82af" stroke-width="1.0" stroke-linecap="round" stroke-linejoin="round"/><path d="M205.9,151.9 L227.2,164.2" fill="none" stroke="#4a82af" stroke-width="0.9" stroke-linecap="round" stroke-linejoin="round"/></g></svg>
@@ -72,6 +72,29 @@ def render_age(land_age: float, seed: int) -> str:
72
72
  return RegionalSVGRenderer(scale=MAP_SCALE).render(t)
73
73
 
74
74
 
75
+ # A coarse 8×8 "painted" land/elevation mask (0 = sea … 1 = high) — the kind of
76
+ # hint a host or LLM hands mapwright to art-direct the continent's macro shape.
77
+ _HINT_MASK = [
78
+ [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
79
+ [0.0, 0.2, 0.5, 0.6, 0.5, 0.2, 0.0, 0.0],
80
+ [0.0, 0.5, 0.9, 0.7, 0.4, 0.3, 0.2, 0.0],
81
+ [0.0, 0.6, 0.8, 0.3, 0.0, 0.0, 0.3, 0.0],
82
+ [0.0, 0.5, 0.6, 0.2, 0.0, 0.0, 0.4, 0.0],
83
+ [0.0, 0.3, 0.7, 0.6, 0.5, 0.6, 0.7, 0.0],
84
+ [0.0, 0.0, 0.3, 0.6, 0.8, 0.6, 0.3, 0.0],
85
+ [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
86
+ ]
87
+
88
+
89
+ def render_hint(seed: int = 11) -> str:
90
+ """A continent whose macro shape is art-directed by an `elevation_hint`
91
+ (a coarse painted mask); mapwright fills in coasts, erosion, rivers, climate."""
92
+ cfg = WorldMapConfig(sea_level=0.42, edge_falloff=0.3, mountain_density=0.6)
93
+ t = RegionalTerrainGenerator(SeededRNG(seed)).generate(
94
+ MAP_W, MAP_H, config=cfg, elevation_hint=_HINT_MASK)
95
+ return RegionalSVGRenderer(scale=MAP_SCALE).render(t)
96
+
97
+
75
98
  def render_template(template: str, sea_level: float, seed: int) -> str:
76
99
  cfg = WorldMapConfig(sea_level=sea_level)
77
100
  t = RegionalTerrainGenerator(SeededRNG(seed)).generate(MAP_W, MAP_H, config=cfg, template=template)
@@ -195,6 +218,7 @@ def main() -> None:
195
218
  emit("template-atoll", render_template("atoll", 0.55, seed=8))
196
219
  emit("age-young", render_age(0.0, seed=103))
197
220
  emit("age-old", render_age(1.0, seed=103))
221
+ emit("hint", render_hint(seed=11))
198
222
  emit("theme-parchment", render_themed("parchment"))
199
223
  emit("theme-neon", render_themed("neon"))
200
224
  emit("theme-dune", render_themed("dune"))
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "mapwright"
7
- version = "0.18.0"
7
+ version = "0.19.0"
8
8
  description = "Domain-neutral procedural fantasy map & world generation: Voronoi terrain, hydraulic erosion, biomes, rivers, Markov place-names, and shaded-relief SVG."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -60,7 +60,7 @@ from .terrain import (
60
60
  compute_cell_polygons,
61
61
  )
62
62
 
63
- __version__ = "0.18.0"
63
+ __version__ = "0.19.0"
64
64
 
65
65
  __all__ = [
66
66
  "SeededRNG",
@@ -40,6 +40,7 @@ import math
40
40
  from collections import deque
41
41
  from dataclasses import asdict, dataclass, field
42
42
  from enum import IntEnum
43
+ from typing import Callable, Sequence, Union
43
44
 
44
45
  import numpy as np
45
46
 
@@ -47,6 +48,12 @@ from . import _geometry, _serde
47
48
  from .config import WorldMapConfig
48
49
  from .rng import SeededRNG
49
50
 
51
+ # A caller-supplied macro shape for the land: either a coarse 2D grid of
52
+ # elevations (rows = north→south, cols = west→east; any numeric range — only the
53
+ # relative ordering matters) bilinearly sampled across the map, or a callable
54
+ # ``f(x_norm, y_norm) -> elevation`` taking normalised coords in [0, 1].
55
+ ElevationHint = Union[Sequence[Sequence[float]], np.ndarray, Callable[[float, float], float]]
56
+
50
57
 
51
58
  class Biome(IntEnum):
52
59
  """Coarse biome classes. Mapping to a host app's tile vocabulary is the
@@ -237,6 +244,7 @@ class RegionalTerrainGenerator:
237
244
  cell_area: float = 6.0,
238
245
  relax_iterations: int = 2,
239
246
  template: str = "",
247
+ elevation_hint: ElevationHint | None = None,
240
248
  ) -> TerrainResult:
241
249
  """Run the full pipeline and return terrain for a ``width×height`` grid.
242
250
 
@@ -249,6 +257,16 @@ class RegionalTerrainGenerator:
249
257
  ``"volcano"``) selects a composed-op heightmap *archetype* instead of the
250
258
  default tectonic-plate auto-generation; ``config`` still drives sea level,
251
259
  climate, rivers, etc. on top of it.
260
+
261
+ ``elevation_hint`` lets a host (or an LLM) **art-direct the macro shape** —
262
+ where land, sea and high ground sit — while mapwright fills in organic
263
+ coastlines, erosion, rivers and climate. Pass a coarse 2D grid of
264
+ elevations (e.g. a 16×16 nested list; rows north→south, cols west→east) or
265
+ a callable ``f(x_norm, y_norm) -> elevation`` over normalised [0, 1] coords.
266
+ Only the *relative* ordering of the values matters; ``sea_level`` still sets
267
+ how much floods (the lowest ``sea_level`` fraction of the hinted surface
268
+ becomes water). It takes precedence over ``template``. Set
269
+ ``edge_falloff=0`` in the config to let the hint place land at the borders.
252
270
  """
253
271
  cfg = config or WorldMapConfig()
254
272
  sea_level = cfg.sea_level
@@ -259,7 +277,8 @@ class RegionalTerrainGenerator:
259
277
  cell_of, seeds = _geometry.voronoi_grid(width, height, seeds, relax_iterations)
260
278
  cells = self._build_cells(seeds, cell_of)
261
279
 
262
- self._init_heightmap(cells, width, height, cfg, template=template)
280
+ self._init_heightmap(cells, width, height, cfg, template=template,
281
+ elevation_hint=elevation_hint)
263
282
  for cell in cells:
264
283
  cell.is_water = cell.height < sea_level
265
284
 
@@ -336,9 +355,36 @@ class RegionalTerrainGenerator:
336
355
  res *= 2
337
356
  return total / norm
338
357
 
358
+ def _sample_hint(self, hint: ElevationHint, centroids: np.ndarray,
359
+ width: int, height: int) -> np.ndarray:
360
+ """Sample a caller's elevation hint at each cell centroid → an array of
361
+ per-cell elevations. ``hint`` is a callable over normalised [0,1] coords,
362
+ or a 2D grid (rows north→south, cols west→east) bilinearly interpolated."""
363
+ xn = np.clip(centroids[:, 0] / max(1, width), 0.0, 1.0)
364
+ yn = np.clip(centroids[:, 1] / max(1, height), 0.0, 1.0)
365
+ if callable(hint):
366
+ sampled = np.array([float(hint(float(x), float(y))) for x, y in zip(xn, yn)])
367
+ else:
368
+ grid = np.asarray(hint, dtype=float)
369
+ if grid.ndim != 2 or grid.size == 0:
370
+ raise ValueError("elevation_hint grid must be a non-empty 2D array")
371
+ gh, gw = grid.shape
372
+ u, v = xn * (gw - 1), yn * (gh - 1) # fractional grid coords
373
+ x0, y0 = np.floor(u).astype(int), np.floor(v).astype(int)
374
+ x1, y1 = np.minimum(x0 + 1, gw - 1), np.minimum(y0 + 1, gh - 1)
375
+ fx, fy = u - x0, v - y0
376
+ top = grid[y0, x0] * (1 - fx) + grid[y0, x1] * fx
377
+ bot = grid[y1, x0] * (1 - fx) + grid[y1, x1] * fx
378
+ sampled = top * (1 - fy) + bot * fy
379
+ # A non-finite hint (NaN/inf from a buggy callable or grid) would silently
380
+ # poison every height; fail loudly instead.
381
+ if not np.all(np.isfinite(sampled)):
382
+ raise ValueError("elevation_hint produced non-finite values (NaN/inf)")
383
+ return sampled
384
+
339
385
  def _init_heightmap(
340
386
  self, cells: list[TerrainCell], width: int, height: int, cfg: WorldMapConfig,
341
- template: str = "",
387
+ template: str = "", elevation_hint: ElevationHint | None = None,
342
388
  ) -> None:
343
389
  cx, cy = width / 2, height / 2
344
390
  diag = math.hypot(width, height)
@@ -346,6 +392,20 @@ class RegionalTerrainGenerator:
346
392
  d_true = np.sqrt((centroids[:, 0] - cx) ** 2 + (centroids[:, 1] - cy) ** 2) / (diag / 2)
347
393
  n_cells = len(cells)
348
394
 
395
+ # Hint mode (caller art-directs the macro shape) — highest precedence. The
396
+ # hint sets *where* land/high ground sit; mapwright still adds organic
397
+ # coastline detail (fbm) and runs the full erosion/hydrology/climate
398
+ # pipeline. Normalised to [0,1] so any input range works; sea level + the
399
+ # land_age gamma in _finalize_heights then do their usual job.
400
+ if elevation_hint is not None:
401
+ h = self._sample_hint(elevation_hint, centroids, width, height)
402
+ hmin, hmax = float(h.min()), float(h.max())
403
+ h = (h - hmin) / max(1e-9, hmax - hmin)
404
+ coast = (self._fbm(centroids, width, height, octaves=5, base_res=3) - 0.5) * 2.0
405
+ raw = (h - 0.5) * 2.0 + 0.25 * coast
406
+ self._finalize_heights(cells, raw, d_true, cfg)
407
+ return
408
+
349
409
  # Template mode (Azgaar-style composed ops) — an alternative to the default
350
410
  # tectonic auto-generation, for controllable continent archetypes.
351
411
  if template in TERRAIN_TEMPLATES:
@@ -201,6 +201,70 @@ class TestTemplates:
201
201
  assert a == b
202
202
 
203
203
 
204
+ class TestElevationHint:
205
+ def test_none_hint_is_byte_identical_to_default(self):
206
+ a = [c.height for c in _gen(7, 40, 28).cells]
207
+ b = [c.height for c in _gen(7, 40, 28, elevation_hint=None).cells]
208
+ assert a == b
209
+
210
+ def test_grid_hint_places_land_where_painted(self):
211
+ # West low, east high → land concentrates in the east half.
212
+ grid = [[0.1, 0.1, 0.9, 0.9] for _ in range(4)]
213
+ cfg = WorldMapConfig(sea_level=0.5, edge_falloff=0.0)
214
+ land = [c for c in _gen(7, 40, 28, config=cfg, elevation_hint=grid).cells
215
+ if not c.is_water]
216
+ west = sum(1 for c in land if c.cx < 20)
217
+ east = sum(1 for c in land if c.cx >= 20)
218
+ assert east > 3 * max(1, west)
219
+
220
+ def test_callable_hint_places_land_in_a_central_disk(self):
221
+ def disk(x, y):
222
+ return 1.0 - ((x - 0.5) ** 2 + (y - 0.5) ** 2) ** 0.5
223
+ cfg = WorldMapConfig(sea_level=0.45)
224
+ land = [c for c in _gen(7, 40, 28, config=cfg, elevation_hint=disk).cells
225
+ if not c.is_water]
226
+ mx = sum(c.cx for c in land) / len(land)
227
+ my = sum(c.cy for c in land) / len(land)
228
+ assert 15 < mx < 25 and 9 < my < 19 # ~map centre (20, 14)
229
+
230
+ def test_hint_is_deterministic(self):
231
+ grid = [[0.2, 0.8], [0.8, 0.2]]
232
+ a = [c.height for c in _gen(7, 36, 24, elevation_hint=grid).cells]
233
+ b = [c.height for c in _gen(7, 36, 24, elevation_hint=grid).cells]
234
+ assert a == b
235
+
236
+ def test_hint_still_forms_rivers_and_water(self):
237
+ grid = [[0.0, 0.3, 0.0], [0.3, 1.0, 0.3], [0.0, 0.3, 0.0]]
238
+ t = _gen(7, 70, 50, config=WorldMapConfig(sea_level=0.45), elevation_hint=grid)
239
+ assert any(c.is_water for c in t.cells)
240
+ assert any(not c.is_water for c in t.cells)
241
+ assert t.rivers # erosion/hydrology still runs on the hinted surface
242
+
243
+ def test_hint_takes_precedence_over_template(self):
244
+ grid = [[0.9, 0.1], [0.9, 0.1]]
245
+ cfg = WorldMapConfig(edge_falloff=0.0)
246
+ with_hint = [c.is_water for c in
247
+ _gen(7, 40, 28, config=cfg, template="atoll", elevation_hint=grid).cells]
248
+ just_template = [c.is_water for c in
249
+ _gen(7, 40, 28, config=cfg, template="atoll").cells]
250
+ assert with_hint != just_template
251
+
252
+ def test_invalid_hint_raises(self):
253
+ import pytest
254
+ for bad in ([1, 2, 3], [], [[]], "nope"):
255
+ with pytest.raises(ValueError):
256
+ _gen(1, 24, 18, elevation_hint=bad)
257
+
258
+ def test_non_finite_hint_raises(self):
259
+ import math
260
+
261
+ import pytest
262
+ with pytest.raises(ValueError):
263
+ _gen(1, 24, 18, elevation_hint=lambda x, y: float("nan"))
264
+ with pytest.raises(ValueError):
265
+ _gen(1, 24, 18, elevation_hint=[[0.0, math.inf], [0.0, 0.0]])
266
+
267
+
204
268
  class TestParameters:
205
269
  def test_higher_sea_level_means_more_water(self):
206
270
  from mapwright.config import WorldMapConfig
File without changes
File without changes
File without changes
File without changes