diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
new file mode 100644
index 000000000..2367db678
--- /dev/null
+++ b/.github/CONTRIBUTING.md
@@ -0,0 +1,6 @@
+Thank you for your interest in contributing to DFHack! If you're reading this
+document, you're probably viewing it on GitHub. The DFHack docs are hosted
+on [ReadTheDocs](https://dfhack.readthedocs.io/) - in particular, contributing
+guidelines are [here](https://docs.dfhack.org/en/latest/docs/Contributing.html).
+Double-checking the style guidelines before submitting a pull request is
+always appreciated.
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 000000000..869ca407e
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,177 @@
+name: Build
+
+on: [push, pull_request]
+
+jobs:
+ build:
+ runs-on: ${{ matrix.os }}
+ name: build (Linux, GCC ${{ matrix.gcc }}, ${{ matrix.plugins }} plugins)
+ strategy:
+ fail-fast: false
+ matrix:
+ os:
+ - ubuntu-18.04
+ gcc:
+ - 4.8
+ - 7
+ plugins:
+ - default
+ include:
+ - os: ubuntu-20.04
+ gcc: 10
+ plugins: all
+ steps:
+ - name: Set up Python 3
+ uses: actions/setup-python@v2
+ with:
+ python-version: 3
+ - name: Install dependencies
+ run: |
+ sudo apt-get update
+ sudo apt-get install \
+ libgtk2.0-0 \
+ libsdl-image1.2-dev \
+ libsdl-ttf2.0-dev \
+ libsdl1.2-dev \
+ libxml-libxml-perl \
+ libxml-libxslt-perl \
+ lua5.3 \
+ ninja-build \
+ zlib1g-dev
+ pip install sphinx
+ - name: Install GCC
+ run: |
+ sudo apt-get install gcc-${{ matrix.gcc }} g++-${{ matrix.gcc }}
+ - name: Clone DFHack
+ uses: actions/checkout@v1
+ with:
+ fetch-depth: 0 # unlimited - we need past tags
+ submodules: true
+ - name: Set up environment
+ id: env_setup
+ run: |
+ DF_VERSION="$(sh travis/get-df-version.sh)"
+ echo "::set-output name=df_version::${DF_VERSION}"
+ echo "DF_VERSION=${DF_VERSION}" >> $GITHUB_ENV
+ echo "DF_FOLDER=${HOME}/DF/${DF_VERSION}/df_linux" >> $GITHUB_ENV
+ - name: Fetch DF cache
+ uses: actions/cache@v2
+ with:
+ path: ~/DF
+ key: ${{ steps.env_setup.outputs.df_version }}
+ - name: Download DF
+ run: |
+ sh travis/download-df.sh
+ - name: Build DFHack
+ env:
+ CC: gcc-${{ matrix.gcc }}
+ CXX: g++-${{ matrix.gcc }}
+ run: |
+ cmake \
+ -S . \
+ -B build-ci \
+ -G Ninja \
+ -DDFHACK_BUILD_ARCH=64 \
+ -DBUILD_TESTS:BOOL=ON \
+ -DBUILD_DEV_PLUGINS:BOOL=${{ matrix.plugins == 'all' }} \
+ -DBUILD_SIZECHECK:BOOL=${{ matrix.plugins == 'all' }} \
+ -DBUILD_STONESENSE:BOOL=${{ matrix.plugins == 'all' }} \
+ -DBUILD_SUPPORTED:BOOL=1 \
+ -DCMAKE_INSTALL_PREFIX="$DF_FOLDER"
+ ninja -C build-ci install
+ - name: Run tests
+ id: run_tests
+ run: |
+ export TERM=dumb
+ mv "$DF_FOLDER"/dfhack.init-example "$DF_FOLDER"/dfhack.init
+ script -qe -c "python travis/run-tests.py --headless --keep-status \"$DF_FOLDER\""
+ python travis/check-rpc.py "$DF_FOLDER/dfhack-rpc.txt"
+ mkdir -p artifacts
+ cp "$DF_FOLDER/test_status.json" "$DF_FOLDER"/*.log artifacts
+ - name: Upload test artifacts
+ uses: actions/upload-artifact@v1
+ if: (success() || failure()) && steps.run_tests.outcome != 'skipped'
+ continue-on-error: true
+ with:
+ name: test-artifacts-${{ matrix.gcc }}
+ path: artifacts
+ - name: Clean up DF folder
+ # prevent DFHack-generated files from ending up in the cache
+ # (download-df.sh also removes them, this is just to save cache space)
+ if: success() || failure()
+ run: |
+ rm -rf "$DF_FOLDER"
+
+ docs:
+ runs-on: ubuntu-18.04
+ steps:
+ - name: Set up Python 3
+ uses: actions/setup-python@v2
+ with:
+ python-version: 3
+ - name: Install dependencies
+ run: |
+ pip install sphinx
+ - name: Clone DFHack
+ uses: actions/checkout@v1
+ with:
+ submodules: true
+ - name: Build docs
+ run: |
+ sphinx-build -W --keep-going -j3 . docs/html
+ - name: Upload docs
+ uses: actions/upload-artifact@v1
+ with:
+ name: docs
+ path: docs/html
+
+ lint:
+ runs-on: ubuntu-18.04
+ steps:
+ - name: Set up Python 3
+ uses: actions/setup-python@v2
+ with:
+ python-version: 3
+ - name: Set up Ruby 2.7
+ uses: actions/setup-ruby@v1
+ with:
+ ruby-version: 2.7
+ - name: Install Lua
+ run: |
+ sudo apt-get update
+ sudo apt-get install lua5.3
+ - name: Clone DFHack
+ uses: actions/checkout@v1
+ with:
+ submodules: true
+ # don't need tags here
+ - name: Check whitespace
+ run: |
+ python travis/lint.py
+ - name: Check Authors.rst
+ if: success() || failure()
+ run: |
+ python travis/authors-rst.py
+ - name: Check for missing documentation
+ if: success() || failure()
+ run: |
+ python travis/script-docs.py
+ - name: Check Lua syntax
+ if: success() || failure()
+ run: |
+ python travis/script-syntax.py --ext=lua --cmd="luac5.3 -p" --github-actions
+ - name: Check Ruby syntax
+ if: success() || failure()
+ run: |
+ python travis/script-syntax.py --ext=rb --cmd="ruby -c" --github-actions
+
+ check-pr:
+ runs-on: ubuntu-latest
+ if: github.event_name == 'pull_request'
+ steps:
+ - name: Check that PR is based on develop branch
+ env:
+ BASE_BRANCH: ${{ github.base_ref }}
+ run: |
+ echo "PR base branch: $BASE_BRANCH"
+ test "$BASE_BRANCH" = develop
diff --git a/.gitignore b/.gitignore
index db4ed747c..4b533ab20 100644
--- a/.gitignore
+++ b/.gitignore
@@ -17,12 +17,14 @@ build/VC2010
# Sphinx generated documentation
docs/_*
docs/html/
+docs/pdf/
# in-place build
build/Makefile
build/CMakeCache.txt
build/cmake_install.cmake
build/CMakeFiles
+build/data
build/doc
build/lua
build/bin
diff --git a/.gitmodules b/.gitmodules
index 98e06473d..e548e27f9 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -16,3 +16,15 @@
[submodule "depends/jsoncpp"]
path = depends/jsoncpp-sub
url = ../../DFHack/jsoncpp.git
+[submodule "depends/xlsxio"]
+ path = depends/xlsxio
+ url = ../../DFHack/xlsxio.git
+ shallow = true
+[submodule "depends/libzip"]
+ path = depends/libzip
+ url = ../../DFHack/libzip.git
+ shallow = true
+[submodule "depends/libexpat"]
+ path = depends/libexpat
+ url = ../../DFHack/libexpat.git
+ shallow = true
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index c096552bc..000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,64 +0,0 @@
-sudo: false
-language: cpp
-cache:
- pip: true
- directories:
- - $HOME/DF-travis
- - $HOME/lua53
-addons:
- apt:
- packages: &default_packages
- - libsdl-image1.2-dev
- - libsdl-ttf2.0-dev
- - libsdl1.2-dev
- - libxml-libxml-perl
- - libxml-libxslt-perl
- - ninja-build
- - zlib1g-dev
-matrix:
- include:
- - env: GCC_VERSION=4.8
- addons:
- apt:
- sources:
- - ubuntu-toolchain-r-test
- packages:
- - *default_packages
- - gcc-4.8
- - g++-4.8
-before_install:
-- export DF_VERSION=$(sh travis/get-df-version.sh)
-- export DF_FOLDER="$HOME/DF-travis/$DF_VERSION/df_linux"
-- pip install --user "sphinx==1.4" "requests[security]"
-- sh travis/build-lua.sh
-- sh travis/download-df.sh
-script:
-- export PATH="$PATH:$HOME/lua53/bin"
-- git tag tmp-travis-build
-- sh travis/git-info.sh
-- sphinx-build -qW -j3 . docs/html
-- python travis/pr-check-base.py
-- python travis/lint.py
-- python travis/authors-rst.py
-- python travis/script-docs.py
-- python travis/script-syntax.py --ext=lua --cmd="luac5.3 -p"
-- python travis/script-syntax.py --ext=rb --cmd="ruby -c"
-- mkdir build-travis
-- cd build-travis
-- cmake .. -G Ninja -DCMAKE_C_COMPILER=gcc-$GCC_VERSION -DCMAKE_CXX_COMPILER=g++-$GCC_VERSION -DDFHACK_BUILD_ARCH=64 -DBUILD_DOCS:BOOL=ON -DBUILD_TESTS:BOOL=ON -DCMAKE_INSTALL_PREFIX="$DF_FOLDER"
-- ninja -j3 install
-- mv "$DF_FOLDER"/dfhack.init-example "$DF_FOLDER"/dfhack.init
-- cd ..
-- python travis/run-tests.py --headless --keep-status "$DF_FOLDER"
-- python travis/check-rpc.py "$DF_FOLDER/dfhack-rpc.txt"
-- cat "$DF_FOLDER/test_status.json"
-before_cache:
-- cat "$DF_FOLDER/stderr.log"
-- rm -rf "$DF_FOLDER"
-notifications:
- email: false
- irc:
- channels:
- - "chat.freenode.net#dfhack"
- on_success: change
- on_failure: always
diff --git a/CMakeLists.txt b/CMakeLists.txt
index e40c932a0..4f8b42521 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,6 +2,7 @@
## some generic CMake magic
cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR)
+cmake_policy(SET CMP0048 NEW)
project(dfhack)
if("${CMAKE_GENERATOR}" STREQUAL Ninja)
@@ -10,6 +11,12 @@ if("${CMAKE_GENERATOR}" STREQUAL Ninja)
endif()
endif()
+if(NOT("${CMAKE_VERSION}" VERSION_LESS 3.12))
+ # make ZLIB_ROOT work in CMake >= 3.12
+ # https://cmake.org/cmake/help/git-stage/policy/CMP0074.html
+ cmake_policy(SET CMP0074 NEW)
+endif()
+
# Set up build types
if(CMAKE_CONFIGURATION_TYPES)
set(CMAKE_CONFIGURATION_TYPES "Release;RelWithDebInfo" CACHE STRING "List of supported configuration types" FORCE)
@@ -83,6 +90,10 @@ if(MSVC)
# a smaller type, and most of the time this is just conversion from 64 to 32 bits
# for things like vector sizes, which are never that big anyway.
add_definitions("/wd4267")
+
+ # MSVC panics if an object file contains more than 65,279 sections. this
+ # happens quite frequently with code that uses templates, such as vectors.
+ add_definitions("/bigobj")
endif()
# Automatically detect architecture based on Visual Studio generator
@@ -168,14 +179,14 @@ if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}")
endif()
# make sure all the necessary submodules have been set up
-if(NOT EXISTS ${dfhack_SOURCE_DIR}/library/xml/codegen.pl OR NOT EXISTS ${dfhack_SOURCE_DIR}/depends/clsocket/CMakeLists.txt)
+if(NOT EXISTS ${dfhack_SOURCE_DIR}/library/xml/codegen.pl OR NOT EXISTS ${dfhack_SOURCE_DIR}/depends/clsocket/CMakeLists.txt OR NOT EXISTS ${dfhack_SOURCE_DIR}/depends/libexpat/expat/CMakeLists.txt OR NOT EXISTS ${dfhack_SOURCE_DIR}/depends/libzip/CMakeLists.txt OR NOT EXISTS ${dfhack_SOURCE_DIR}/depends/xlsxio/CMakeLists.txt)
message(SEND_ERROR "One or more required submodules could not be found! Run 'git submodule update --init' from the root DFHack directory. (See the section 'Getting the Code' in docs/Compile.rst)")
endif()
# set up versioning.
set(DF_VERSION "0.47.04")
-set(DFHACK_RELEASE "beta1")
-set(DFHACK_PRERELEASE TRUE)
+set(DFHACK_RELEASE "r3")
+set(DFHACK_PRERELEASE FALSE)
set(DFHACK_VERSION "${DF_VERSION}-${DFHACK_RELEASE}")
@@ -396,6 +407,7 @@ endif()
include_directories(depends/tthread)
include_directories(${ZLIB_INCLUDE_DIRS})
include_directories(depends/clsocket/src)
+include_directories(depends/xlsxio/include)
add_subdirectory(depends)
find_package(Git REQUIRED)
@@ -419,6 +431,7 @@ if(BUILD_PLUGINS)
add_subdirectory(plugins)
endif()
+add_subdirectory(data)
add_subdirectory(scripts)
find_package(Sphinx QUIET)
@@ -429,6 +442,7 @@ if(BUILD_DOCS)
file(GLOB SPHINX_DEPS
"${CMAKE_CURRENT_SOURCE_DIR}/docs/*.rst"
+ "${CMAKE_CURRENT_SOURCE_DIR}/docs/guides/*.rst"
"${CMAKE_CURRENT_SOURCE_DIR}/docs/changelog.txt"
"${CMAKE_CURRENT_SOURCE_DIR}/docs/gen_changelog.py"
"${CMAKE_CURRENT_SOURCE_DIR}/docs/images/*.png"
diff --git a/Contributing.rst b/Contributing.rst
deleted file mode 100644
index e358e66b3..000000000
--- a/Contributing.rst
+++ /dev/null
@@ -1,229 +0,0 @@
-###########################
-How to contribute to DFHack
-###########################
-
-.. contents::
-
-
-.. _contributing-code:
-
-Contributing Code
-=================
-Several things should be kept in mind when contributing code to DFHack.
-
-Code Format
------------
-* Four space indents for C++. Never use tabs for indentation in any language.
-* LF (Unix style) line terminators
-* Avoid trailing whitespace
-* UTF-8 encoding
-* For C++:
-
- * Opening and closing braces on their own lines or opening brace at the end of the previous line
- * Braces placed at original indent level if on their own lines
- * #includes should be sorted. C++ libraries first, then dfhack modules, then df structures,
- then local includes. Within each category they should be sorted alphabetically.
-
-How to get new code into DFHack
--------------------------------
-* Submit pull requests to the ``develop`` branch, not the ``master`` branch.
- (The ``master`` branch always points at the most recent release)
-* Use a new branch for each feature or bugfix so that your changes can be merged independently
- (i.e. not the master or develop branch of your fork).
-* If possible, compile on multiple platforms when changing anything that compiles
-* It must pass CI - run ``python travis/all.py`` to check this.
-* Update ``changelog.txt`` and ``docs/Authors.rst`` when applicable. See
- `build-changelog` for more information on the changelog format.
-* Create a GitHub pull request once finished
-* Submit ideas and bug reports as :issue:`issues on GitHub <>`.
- Posts in the forum thread can easily get missed or forgotten.
-* Work on :issue:`reported problems `
- will take priority over ideas or suggestions.
-
-.. _contributing-memory-research:
-
-Memory research
----------------
-If you want to do memory research, you'll need some tools and some knowledge.
-In general, you'll need a good memory viewer and optionally something
-to look at machine code without getting crazy :)
-Using publicly known information and analyzing the game's data is preferred.
-
-Good Windows tools include:
-
-* IDA Freeware 7.0 (for non-commercial use, supports 32-bit and 64-bit)
-* Cheat Engine
-
-Good Linux tools:
-
-* angavrilov's df-structures gui (32-bit only, visit us on IRC for details)
-* IDA Freeware 7.0 (see above)
-* edb (Evan's Debugger)
-* Some of the tools residing in the ``legacy`` dfhack branch.
-
-Using the library as a developer
-================================
-Currently, the most direct way to use the library is to write a script or plugin that can be loaded by it.
-All the plugins can be found in the 'plugins' folder. There's no in-depth documentation
-on how to write one yet, but it should be easy enough to copy one and just follow the pattern.
-``plugins/skeleton/skeleton.cpp`` is provided for this purpose.
-
-Other than through plugins, it is possible to use DFHack via remote access interface,
-or by writing scripts in Lua or Ruby. There are plenty of examples in the scripts folder.
-The `lua-api` is quite well documented.
-
-The most important parts of DFHack are the Core, Console, Modules and Plugins.
-
-* Core acts as the centerpiece of DFHack - it acts as a filter between DF and
- SDL and synchronizes the various plugins with DF.
-* Console is a thread-safe console that can be used to invoke commands exported by Plugins.
-* Modules actually describe the way to access information in DF's memory. You
- can get them from the Core. Most modules are split into two parts: high-level
- and low-level. High-level is mostly method calls, low-level publicly visible
- pointers to DF's data structures.
-* Plugins are the tools that use all the other stuff to make things happen.
- A plugin can have a list of commands that it exports and an onupdate function
- that will be called each DF game tick.
-
-Rudimentary API documentation can be built using doxygen (see build options
-in ``CMakeCache.txt`` or with ``ccmake`` or ``cmake-gui``). The full DFHack
-documentation is built with Sphinx_, which runs automatically at compile time.
-
-.. _Sphinx: http://www.sphinx-doc.org
-
-DFHack consists of variously licensed code, but invariably weak copyleft.
-The main license is zlib/libpng, some bits are MIT licensed, and some are
-BSD licensed. See the `license` for more information.
-
-Feel free to add your own extensions and plugins. Contributing back to
-the DFHack repository is welcome and the right thing to do :)
-
-DF data structure definitions
------------------------------
-DFHack uses information about the game data structures, represented via xml files
-in the ``library/xml/`` submodule.
-
-See https://github.com/DFHack/df-structures, and the documentation linked in the index.
-
-Data structure layouts are described in files following the ``df.*.xml`` name pattern.
-This information is transformed by a perl script into C++ headers describing the
-structures, and associated metadata for the Lua wrapper. These headers and data
-are then compiled into the DFHack libraries, thus necessitating a compatibility
-break every time layouts change; in return it significantly boosts the efficiency
-and capabilities of DFHack code.
-
-Global object addresses are stored in :file:`symbols.xml`, which is copied to the dfhack
-release package and loaded as data at runtime.
-
-Remote access interface
------------------------
-DFHack supports remote access by exchanging Google protobuf messages via a TCP
-socket. Both the core and plugins can define remotely accessible methods. The
-``dfhack-run`` command uses this interface to invoke ordinary console commands.
-
-Currently the supported set of requests is limited, because the developers don't
-know what exactly is most useful. `remotefortressreader` provides a fairly
-comprehensive interface for visualisers such as :forums:`Armok Vision <146473>`.
-
-
-Documentation Standards
-=======================
-DFHack documentation is built with Sphinx_, and configured automatically
-through CMake. If you want to build the docs *only*, use this command::
-
- sphinx-build . docs/html
-
-Whether you're adding new code or just fixing old documentation (and there's plenty),
-there are a few important standards for completeness and consistent style. Treat
-this section as a guide rather than iron law, match the surrounding text, and you'll
-be fine.
-
-Each command should have a short (~54 character) help string, which is shown
-by the `ls` command. For scripts, this is a comment on the first line
-(the comment marker and whitespace is stripped). For plugins it's the second
-argument to ``PluginCommand``. Please make this brief but descriptive!
-
-Everything should be documented! If it's not clear *where* a particular
-thing should be documented, ask on IRC or in the DFHack thread on Bay12 -
-as well as getting help, you'll be providing valuable feedback that
-makes it easier for future readers!
-
-Scripts can use a custom autodoc function, based on the Sphinx ``include``
-directive - anything between the tokens is copied into the appropriate scripts
-documentation page. For Ruby, we follow the built-in docstring convention
-(``=begin`` and ``=end``). For Lua, the tokens are ``[====[`` and ``]====]``
-- ordinary multi-line strings. It is highly encouraged to reuse this string
-as the in-console documentation by (eg.) printing it when a ``-help`` argument
-is given.
-
-The docs **must** have a heading which exactly matches the command, underlined
-with ``=====`` to the same length. For example, a lua file would have::
-
- local helpstr = [====[
-
- add-thought
- ===========
- Adds a thought or emotion to the selected unit. Can be used by other scripts,
- or the gui invoked by running ``add-thought gui`` with a unit selected.
-
- ]====]
-
-
-Where the heading for a section is also the name of a command, the spelling
-and case should exactly match the command to enter in the DFHack command line.
-
-Try to keep lines within 80-100 characters, so it's readable in plain text
-in the terminal - Sphinx (our documentation system) will make sure
-paragraphs flow.
-
-If there aren't many options or examples to show, they can go in a paragraph of
-text. Use double-backticks to put commands in monospaced font, like this::
-
- You can use ``cleanowned scattered x`` to dump tattered or abandoned items.
-
-If the command takes more than three arguments, format the list as a table
-called Usage. The table *only* lists arguments, not full commands.
-Input values are specified in angle brackets. Example::
-
- Usage:
-
- :arg1: A simple argument.
- :arg2 : Does something based on the input value.
- :Very long argument:
- Is very specific.
-
-To demonstrate usage - useful mainly when the syntax is complicated, list the
-full command with arguments in monospaced font, then indent the next line and
-describe the effect::
-
- ``resume all``
- Resumes all suspended constructions.
-
-If it would be helpful to mention another DFHack command, don't just type the
-name - add a hyperlink! Specify the link target in backticks, and it will be
-replaced with the corresponding title and linked: eg ```autolabor```
-=> `autolabor`. Link targets should be equivalent to the command
-described (without file extension), and placed above the heading of that
-section like this::
-
- .. _autolabor:
-
- autolabor
- =========
-
-Add link targets if you need them, but otherwise plain headings are preferred.
-Scripts have link targets created automatically.
-
-Other ways to help
-==================
-DFHack is a software project, but there's a lot more to it than programming.
-If you're not comfortable programming, you can help by:
-
-* reporting bugs and incomplete documentation
-* improving the documentation
-* finding third-party scripts to add
-* writing tutorials for newbies
-
-All those things are crucial, and often under-represented. So if that's
-your thing, go get started!
-
diff --git a/README.md b/README.md
index fd95e1e5e..e4bfefb38 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
# DFHack Readme
-[![Build Status](https://travis-ci.org/DFHack/dfhack.svg?branch=develop)](https://travis-ci.org/DFHack/dfhack)
+[![Build Status](https://github.com/DFHack/dfhack/workflows/Build/badge.svg?event=push)](https://github.com/DFHack/dfhack/actions?query=workflow%3ABuild)
[![Documentation Status](https://readthedocs.org/projects/dfhack/badge)](https://dfhack.readthedocs.org)
[![License](https://img.shields.io/badge/license-ZLib-blue.svg)](https://en.wikipedia.org/wiki/Zlib_License)
diff --git a/conf.py b/conf.py
index bfd69d828..d5ecc3a45 100644
--- a/conf.py
+++ b/conf.py
@@ -15,14 +15,13 @@ serve to show the default.
# pylint:disable=redefined-builtin
+import datetime
from io import open
import os
import re
import shlex # pylint:disable=unused-import
import sys
-sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)), 'docs'))
-from gen_changelog import generate_changelog
# -- Support :dfhack-keybind:`command` ------------------------------------
# this is a custom directive that pulls info from dfhack.init-example
@@ -152,9 +151,10 @@ def write_script_docs():
'gui': 'GUI Scripts',
'modtools': 'Scripts for Modders'}
for k in head:
- title = ('.. _{k}:\n\n{l}\n{t}\n{l}\n\n'
+ title = ('.. _scripts-{k}:\n\n{l}\n{t}\n{l}\n\n'
'.. include:: /scripts/{a}about.txt\n\n'
- '.. contents::\n\n').format(
+ '.. contents:: Contents\n'
+ ' :local:\n\n').format(
k=k, t=head[k],
l=len(head[k])*'#',
a=('' if k == 'base' else k + '/')
@@ -174,41 +174,48 @@ def all_keybinds_documented():
plugin_binds = set(re.findall(':dfhack-keybind:`(.*?)`', f.read()))
undocumented_binds = configured_binds - script_commands - plugin_binds
if undocumented_binds:
- raise ValueError('The following DFHack commands have undocumented'
+ raise ValueError('The following DFHack commands have undocumented '
'keybindings: {}'.format(sorted(undocumented_binds)))
# Actually call the docs generator and run test
-generate_changelog()
write_script_docs()
all_keybinds_documented()
# -- General configuration ------------------------------------------------
+sys.path.append(os.path.join(os.path.abspath(os.path.dirname(__file__)), 'docs', 'sphinx_extensions'))
+
# If your documentation needs a minimal Sphinx version, state it here.
-needs_sphinx = '1.3'
+needs_sphinx = '1.8'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
-extensions = ['sphinx.ext.extlinks']
+extensions = [
+ 'sphinx.ext.extlinks',
+ 'dfhack.changelog',
+ 'dfhack.lexer',
+]
# This config value must be a dictionary of external sites, mapping unique
# short alias names to a base URL and a prefix.
# See http://sphinx-doc.org/ext/extlinks.html
extlinks = {
- 'wiki': ('http://dwarffortresswiki.org/%s', ''),
+ 'wiki': ('https://dwarffortresswiki.org/%s', ''),
'forums': ('http://www.bay12forums.com/smf/index.php?topic=%s',
'Bay12 forums thread '),
- 'dffd': ('http://dffd.bay12games.com/file.php?id=%s', 'DFFD file '),
- 'bug': ('http://www.bay12games.com/dwarves/mantisbt/view.php?id=%s',
+ 'dffd': ('https://dffd.bay12games.com/file.php?id=%s', 'DFFD file '),
+ 'bug': ('https://www.bay12games.com/dwarves/mantisbt/view.php?id=%s',
'Bug '),
+ 'source': ('https://github.com/DFHack/dfhack/tree/develop/%s', ''),
+ 'source:scripts': ('https://github.com/DFHack/scripts/tree/master/%s', ''),
'issue': ('https://github.com/DFHack/dfhack/issues/%s', 'Issue '),
'commit': ('https://github.com/DFHack/dfhack/commit/%s', 'Commit '),
}
# Add any paths that contain templates here, relative to this directory.
-templates_path = []
+templates_path = ["docs/templates"]
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
@@ -222,7 +229,7 @@ master_doc = 'index'
# General information about the project.
project = 'DFHack'
-copyright = '2015, The DFHack Team'
+copyright = '2015-%d, The DFHack Team' % datetime.datetime.now().year
author = 'The DFHack Team'
# The version info for the project you're documenting, acts as replacement for
@@ -276,16 +283,25 @@ default_role = 'ref'
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
+# The default language to highlight source code in.
+highlight_language = 'dfhack'
+
# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = False
+rst_prolog = """
+.. |sphinx_min_version| replace:: {sphinx_min_version}
+.. |dfhack_version| replace:: {dfhack_version}
+""".format(
+ sphinx_min_version=needs_sphinx,
+ dfhack_version=version,
+)
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
html_theme = 'alabaster'
-html_style = 'dfhack.css'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
@@ -296,6 +312,7 @@ html_theme_options = {
'github_repo': 'dfhack',
'github_button': False,
'travis_button': False,
+ 'fixed_sidebar': True,
}
# The name for this set of Sphinx documents. If None, it defaults to
@@ -335,6 +352,10 @@ html_domain_indices = False
# If false, no index is generated.
html_use_index = False
+html_css_files = [
+ 'dfhack.css',
+]
+
# -- Options for LaTeX output ---------------------------------------------
# Grouping the document tree into LaTeX files. List of tuples
@@ -344,3 +365,5 @@ latex_documents = [
(master_doc, 'DFHack.tex', 'DFHack Documentation',
'The DFHack Team', 'manual'),
]
+
+latex_toplevel_sectioning = 'part'
diff --git a/data/CMakeLists.txt b/data/CMakeLists.txt
new file mode 100644
index 000000000..19acb9261
--- /dev/null
+++ b/data/CMakeLists.txt
@@ -0,0 +1,2 @@
+install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/blueprints/ DESTINATION blueprints)
+install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/quickfort/ DESTINATION "${DFHACK_DATA_DESTINATION}/data/quickfort")
diff --git a/data/blueprints/README.md b/data/blueprints/README.md
new file mode 100644
index 000000000..fb4e2d9ef
--- /dev/null
+++ b/data/blueprints/README.md
@@ -0,0 +1,4 @@
+This folder contains blueprints used by the `quickfort` script. For more information, see:
+
+* [Quickfort command reference](https://docs.dfhack.org/en/stable/docs/_auto/base.html#quickfort)
+* [Quickfort user guide](https://docs.dfhack.org/en/stable/docs/guides/quickfort-user-guide.html)
diff --git a/data/blueprints/library/bedrooms/28-3-Modified_Windmill_Villas.csv b/data/blueprints/library/bedrooms/28-3-Modified_Windmill_Villas.csv
new file mode 100644
index 000000000..89363e35f
--- /dev/null
+++ b/data/blueprints/library/bedrooms/28-3-Modified_Windmill_Villas.csv
@@ -0,0 +1,70 @@
+"#dig start(11; 12) 28 bedrooms, 3 tiles each (efficient layout)"
+# see an image of this blueprint at https://i.imgur.com/XD7D4ux.png
+ , , , , , ,d, , , , , ,d, , , , , , , , ,#
+ , , , , , ,d, , , , , ,d, , , , , , , , ,#
+ , , , ,d, ,d, ,d, ,d, ,d, ,d, , , , , , ,#
+ , , , ,d, ,d, ,d, ,d, ,d, ,d, , , , , , ,#
+ , , , ,d,d,d,d,d, ,d,d,d, ,d, ,d,d,d, , ,#
+ , , , , , ,d, , , , , ,d,d, , ,d, , , , ,#
+ , ,d,d,d, ,d, ,d,d,d, ,d,d,d,d,d,d,d,d,d,#
+ , , , , ,d,d, , , ,d, ,d, , , ,d, , , , ,#
+d,d,d,d,d,d,d,d,d,d,d,d,d, ,d, ,d,d,d, , ,#
+ , , , ,d, , , ,d,i,i,i,d, ,d, , , , , , ,#
+ , ,d,d,d, ,d,d,d,i,i,i,d,d,d, ,d,d,d, , ,#
+ , , , , , ,d, ,d,i,i,i,d, , , ,d, , , , ,#
+ , ,d,d,d, ,d, ,d,d,d,d,d,d,d,d,d,d,d,d,d,#
+ , , , ,d, , , ,d, ,d, , , ,d,d, , , , , ,#
+d,d,d,d,d,d,d,d,d, ,d,d,d, ,d, ,d,d,d, , ,#
+ , , , ,d, , ,d,d, , , , , ,d, , , , , , ,#
+ , ,d,d,d, ,d, ,d,d,d, ,d,d,d,d,d, , , , ,#
+ , , , , , ,d, ,d, ,d, ,d, ,d, ,d, , , , ,#
+ , , , , , ,d, ,d, ,d, ,d, ,d, ,d, , , , ,#
+ , , , , , , , ,d, , , , , ,d, , , , , , ,#
+ , , , , , , , ,d, , , , , ,d, , , , , , ,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+"#build label(furniture) start(11; 11) 28x doors, beds, coffers, and cabinets"
+ , , , , , ,f, , , , , ,f, , , , , , , , ,#
+ , , , , , ,h, , , , , ,h, , , , , , , , ,#
+ , , , ,f, ,b, ,f, ,f, ,b, ,f, , , , , , ,#
+ , , , ,h, ,d, ,h, ,h, ,d, ,h, , , , , , ,#
+ , , , ,b,d,`,d,b, ,b,d,`, ,b, ,b,h,f, , ,#
+ , , , , , ,`, , , , , ,`,d, , ,d, , , , ,#
+ , ,f,h,b, ,`, ,f,h,b, ,`,`,`,`,`,d,b,h,f,#
+ , , , , ,d,`, , , ,d, ,`, , , ,d, , , , ,#
+f,h,b,d,`,`,`,`,`,`,`,`,`, ,f, ,b,h,f, , ,#
+ , , , ,d, , , ,`,`,`,`,`, ,h, , , , , , ,#
+ , ,f,h,b, ,b,d,`,`,`,`,`,d,b, ,b,h,f, , ,#
+ , , , , , ,h, ,`,`,`,`,`, , , ,d, , , , ,#
+ , ,f,h,b, ,f, ,`,`,`,`,`,`,`,`,`,d,b,h,f,#
+ , , , ,d, , , ,`, ,d, , , ,`,d, , , , , ,#
+f,h,b,d,`,`,`,`,`, ,b,h,f, ,`, ,b,h,f, , ,#
+ , , , ,d, , ,d,`, , , , , ,`, , , , , , ,#
+ , ,f,h,b, ,b, ,`,d,b, ,b,d,`,d,b, , , , ,#
+ , , , , , ,h, ,d, ,h, ,h, ,d, ,h, , , , ,#
+ , , , , , ,f, ,b, ,f, ,f, ,b, ,f, , , , ,#
+ , , , , , , , ,h, , , , , ,h, , , , , , ,#
+ , , , , , , , ,f, , , , , ,f, , , , , , ,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+#query label(rooms) start(11; 11) room designations
+ , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , ,r+,, , , , ,r+,, , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , ,#
+ , , , ,r+,, , ,r+,,r+,, , ,r+,,r+,, , , ,#
+ , , , , , , , , , , , , , , , , , , , , ,#
+ , , , ,r+,, , , , ,r+,, , , , , , ,r+,, ,#
+ , , , , , , , , , , , , , , , , , , , , ,#
+ , ,r+,, , , , , , , , , , , , ,r+,, , , ,#
+ , , , , , , , , , , , , , , , , , , , , ,#
+ , , , ,r+,,r+,, , , , , , ,r+,,r+,, , , ,#
+ , , , , , , , , , , , , , , , , , , , , ,#
+ , , , ,r+,, , , , , , , , , , , , ,r+,, ,#
+ , , , , , , , , , , , , , , , , , , , , ,#
+ , ,r+,, , , , , , ,r+,, , , , ,r+,, , , ,#
+ , , , , , , , , , , , , , , , , , , , , ,#
+ , , , ,r+,,r+,, , ,r+,,r+,, , ,r+,, , , ,#
+ , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , ,r+,, , , , ,r+,, , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , ,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
diff --git a/data/blueprints/library/bedrooms/48-4-Raynard_Whirlpool_Housing.csv b/data/blueprints/library/bedrooms/48-4-Raynard_Whirlpool_Housing.csv
new file mode 100644
index 000000000..881be3dd1
--- /dev/null
+++ b/data/blueprints/library/bedrooms/48-4-Raynard_Whirlpool_Housing.csv
@@ -0,0 +1,100 @@
+"#dig start(16; 17; central 3x3 stairwell) 48 rooms, 4 tiles each (more aesthetic)"
+# see an image of this blueprint at: https://i.imgur.com/3pNc0HM.png
+ , , , , , , , , , , , , ,d, , , ,d, , , , , , , , , , , , , ,#
+ , , , ,d, , , ,d, , , ,d,d,d,d,d,d,d, , , ,d, , , ,d, , , , ,#
+ , , ,d,d,d,d,d,d,d, , , ,d, ,d, ,d, , , ,d,d,d,d,d,d,d, , , ,#
+ ,d, , ,d, ,d, ,d, , ,d, , , ,d, , , ,d, , ,d, ,d, ,d, , ,d, ,#
+d,d,d, , , ,d, , , ,d,d,d, ,d,d,d, ,d,d,d, , , ,d, , , ,d,d,d,#
+ ,d, , ,d,d,d,d,d, , ,d, , ,d,d,d, , ,d, , ,d,d,d,d,d, , ,d, ,#
+ ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, ,#
+ ,d, , ,d,d,d,d,d, , ,d, , ,d,d,d, , ,d, , ,d,d,d,d,d, , ,d, ,#
+d,d,d, , , ,d, , , ,d,d,d, ,d,d,d, ,d,d,d, , , ,d, , , ,d,d,d,#
+ ,d, , ,d, ,d, ,d, , ,d, , , ,d, , , ,d, , ,d, ,d, ,d, , ,d, ,#
+ , , ,d,d,d,d,d,d,d, , , ,d, ,d, ,d, , , ,d,d,d,d,d,d,d, , , ,#
+ , , , ,d, ,d, ,d, , , ,d,d,d,d,d,d,d, , , ,d, ,d, ,d, , , , ,#
+ , ,d, , , ,d, , , ,d, , ,d, ,d, ,d, , ,d, , , ,d, , , ,d, , ,#
+ ,d,d,d, ,d,d,d, ,d,d,d, , , ,d, , , ,d,d,d, ,d,d,d, ,d,d,d, ,#
+ , ,d, , ,d,d,d, , ,d, , ,d,i,i,i,d, , ,d, , ,d,d,d, , ,d, , ,#
+ , ,d,d,d,d,d,d,d,d,d,d,d,d,i,i,i,d,d,d,d,d,d,d,d,d,d,d,d, , ,#
+ , ,d, , ,d,d,d, , ,d, , ,d,i,i,i,d, , ,d, , ,d,d,d, , ,d, , ,#
+ ,d,d,d, ,d,d,d, ,d,d,d, , , ,d, , , ,d,d,d, ,d,d,d, ,d,d,d, ,#
+ , ,d, , , ,d, , , ,d, , ,d, ,d, ,d, , ,d, , , ,d, , , ,d, , ,#
+ , , , ,d, ,d, ,d, , , ,d,d,d,d,d,d,d, , , ,d, ,d, ,d, , , , ,#
+ , , ,d,d,d,d,d,d,d, , , ,d, ,d, ,d, , , ,d,d,d,d,d,d,d, , , ,#
+ ,d, , ,d, ,d, ,d, , ,d, , , ,d, , , ,d, , ,d, ,d, ,d, , ,d, ,#
+d,d,d, , , ,d, , , ,d,d,d, ,d,d,d, ,d,d,d, , , ,d, , , ,d,d,d,#
+ ,d, , ,d,d,d,d,d, , ,d, , ,d,d,d, , ,d, , ,d,d,d,d,d, , ,d, ,#
+ ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, ,#
+ ,d, , ,d,d,d,d,d, , ,d, , ,d,d,d, , ,d, , ,d,d,d,d,d, , ,d, ,#
+d,d,d, , , ,d, , , ,d,d,d, ,d,d,d, ,d,d,d, , , ,d, , , ,d,d,d,#
+ ,d, , ,d, ,d, ,d, , ,d, , , ,d, , , ,d, , ,d, ,d, ,d, , ,d, ,#
+ , , ,d,d,d,d,d,d,d, , , ,d, ,d, ,d, , , ,d,d,d,d,d,d,d, , , ,#
+ , , , ,d, , , ,d, , , ,d,d,d,d,d,d,d, , , ,d, , , ,d, , , , ,#
+ , , , , , , , , , , , , ,d, , , ,d, , , , , , , , , , , , , ,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+"#build label(furniture) start(16; 16; central 3x3 stairwell) 48x doors, beds, cabinets, and coffers; 8x statues"
+ , , , , , , , , , , , , ,f, , , ,f, , , , , , , , , , , , , ,#
+ , , , ,h, , , ,h, , , ,b, ,d, ,d, ,b, , , ,h, , , ,h, , , , ,#
+ , , ,b, ,d, ,d, ,b, , , ,h, , , ,h, , , ,b, ,d, ,d, ,b, , , ,#
+ ,b, , ,f, , , ,f, , ,b, , , , , , , ,b, , ,f, , , ,f, , ,b, ,#
+f, ,h, , , , , , , ,h, ,f, , , , , ,f, ,h, , , , , , , ,h, ,f,#
+ ,d, , , , , , , , , ,d, , , , , , , ,d, , , , , , , , , ,d, ,#
+ , , , , , ,s, , , , , , , , ,s, , , , , , , , ,s, , , , , , ,#
+ ,d, , , , , , , , , ,d, , , , , , , ,d, , , , , , , , , ,d, ,#
+f, ,h, , , , , , , ,h, ,f, , , , , ,f, ,h, , , , , , , ,h, ,f,#
+ ,b, , ,f, , , ,f, , ,b, , , , , , , ,b, , ,f, , , ,f, , ,b, ,#
+ , , ,b, ,d, ,d, ,b, , , ,h, , , ,h, , , ,b, ,d, ,d, ,b, , , ,#
+ , , , ,h, , , ,h, , , ,b, ,d, ,d, ,b, , , ,h, , , ,h, , , , ,#
+ , ,b, , , , , , , ,b, , ,f, , , ,f, , ,b, , , , , , , ,b, , ,#
+ ,h, ,f, , , , , ,f, ,h, , , , , , , ,h, ,f, , , , , ,f, ,h, ,#
+ , ,d, , , , , , , ,d, , , , , , , , , ,d, , , , , , , ,d, , ,#
+ , , , , , ,s, , , , , , , , , , , , , , , , , ,s, , , , , , ,#
+ , ,d, , , , , , , ,d, , , , , , , , , ,d, , , , , , , ,d, , ,#
+ ,h, ,f, , , , , ,f, ,h, , , , , , , ,h, ,f, , , , , ,f, ,h, ,#
+ , ,b, , , , , , , ,b, , ,f, , , ,f, , ,b, , , , , , , ,b, , ,#
+ , , , ,h, , , ,h, , , ,b, ,d, ,d, ,b, , , ,h, , , ,h, , , , ,#
+ , , ,b, ,d, ,d, ,b, , , ,h, , , ,h, , , ,b, ,d, ,d, ,b, , , ,#
+ ,b, , ,f, , , ,f, , ,b, , , , , , , ,b, , ,f, , , ,f, , ,b, ,#
+f, ,h, , , , , , , ,h, ,f, , , , , ,f, ,h, , , , , , , ,h, ,f,#
+ ,d, , , , , , , , , ,d, , , , , , , ,d, , , , , , , , , ,d, ,#
+ , , , , , ,s, , , , , , , , ,s, , , , , , , , ,s, , , , , , ,#
+ ,d, , , , , , , , , ,d, , , , , , , ,d, , , , , , , , , ,d, ,#
+f, ,h, , , , , , , ,h, ,f, , , , , ,f, ,h, , , , , , , ,h, ,f,#
+ ,b, , ,f, , , ,f, , ,b, , , , , , , ,b, , ,f, , , ,f, , ,b, ,#
+ , , ,b, ,d, ,d, ,b, , , ,h, , , ,h, , , ,b, ,d, ,d, ,b, , , ,#
+ , , , ,h, , , ,h, , , ,b, ,d, ,d, ,b, , , ,h, , , ,h, , , , ,#
+ , , , , , , , , , , , , ,f, , , ,f, , , , , , , , , , , , , ,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+#query label(rooms) start(16; 16; central 3x3 stairwell) room designations
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , ,r+,, , , , ,r+,, , , , , , , , , , , ,#
+ , , ,r+,, , , , ,r+,, , , , , , , , , , ,r+,, , , , ,r+,, , ,#
+ ,r+,, , , , , , , , ,r+,, , , , , , ,r+,, , , , , , , , ,r+,,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ ,r+,, , , , , , , , ,r+,, , , , , , ,r+,, , , , , , , , ,r+,,#
+ , , ,r+,, , , , ,r+,, , , , , , , , , , ,r+,, , , , ,r+,, , ,#
+ , , , , , , , , , , , ,r+,, , , , ,r+,, , , , , , , , , , , ,#
+ , ,r+,, , , , , , ,r+,, , , , , , , , ,r+,, , , , , , ,r+,, ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , ,r+,, , , , , , ,r+,, , , , , , , , ,r+,, , , , , , ,r+,, ,#
+ , , , , , , , , , , , ,r+,, , , , ,r+,, , , , , , , , , , , ,#
+ , , ,r+,, , , , ,r+,, , , , , , , , , , ,r+,, , , , ,r+,, , ,#
+ ,r+,, , , , , , , , ,r+,, , , , , , ,r+,, , , , , , , , ,r+,,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ ,r+,, , , , , , , , ,r+,, , , , , , ,r+,, , , , , , , , ,r+,,#
+ , , ,r+,, , , , ,r+,, , , , , , , , , , ,r+,, , , , ,r+,, , ,#
+ , , , , , , , , , , , ,r+,, , , , ,r+,, , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
diff --git a/data/blueprints/library/bedrooms/95-9-Hactar1_3_Branch_Tree.csv b/data/blueprints/library/bedrooms/95-9-Hactar1_3_Branch_Tree.csv
new file mode 100644
index 000000000..ec2a1ce1e
--- /dev/null
+++ b/data/blueprints/library/bedrooms/95-9-Hactar1_3_Branch_Tree.csv
@@ -0,0 +1,232 @@
+"#dig start(36;74) 97 rooms, 9 tiles each (fractal design)"
+# see an image of this blueprint at: https://i.imgur.com/ENi5QLX.png
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, , ,d, , ,d, , ,d, , ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, , ,d, , ,d, , ,d, , ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , , ,d, , , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d, ,d,d,d,d, ,d, ,d,d,d,d, ,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d,d,d,d,d,d,d,d, ,d, ,d,d,d,d,d,d,d,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d, ,d,d,d,d, ,d, ,d,d,d,d, ,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , ,d,d,d, , ,d, , , , , , ,d, , , , , , ,d, , , , , , ,d, , , , , , ,d, , ,d,d,d, , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , ,d,d,d, , ,d, , , , , , ,d, , , , , ,d,d,d, , , , , ,d, , , , , , ,d, , ,d,d,d, , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d,d,d,d,d,d,d, ,d,d,d, ,d,d,d,d,d,d,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , ,d,d,d, , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d,d, ,d,d,d, ,d,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d,d,d,d,d,d,d,d,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d,d, ,d,d,d, ,d,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , , ,d, , ,d,d,d, , ,d, , , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, , ,d, , ,d,d,d, , ,d, , ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , ,d,d,d, ,d,d,d, ,d,d,d, , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, , , , , ,d,d,d, , , , , ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , ,d,d,d, ,d,d,d, , ,d, , ,d, , ,d, , ,d,d,d, ,d,d,d, ,d,d,d, , ,d, , ,d, , ,d, , ,d,d,d, ,d,d,d, , , , , , , , , , , , ,#
+ , , , , , , , , , , , ,d,d,d, ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, ,d,d,d, ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, ,d,d,d, , , , , , , , , , , , ,#
+ , , , , , , , , , , , ,d,d,d, ,d,d,d, , ,d, , ,d, , ,d, , ,d,d,d, ,d,d,d, ,d,d,d, , ,d, , ,d, , ,d, , ,d,d,d, ,d,d,d, , , , , , , , , , , , ,#
+ , , , , , , , , , , , , ,d, , , , , , ,d,d,d, ,d, ,d,d,d, , , , , ,d,d,d, , , , , ,d,d,d, ,d, ,d,d,d, , , , , , ,d, , , , , , , , , , , , , ,#
+ , , , , ,d,d,d, ,d,d,d, ,d, ,d,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d,d, ,d, ,d,d,d, ,d,d,d, , , , , ,#
+ , , , , ,d,d,d, ,d,d,d,d,d,d,d,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d,d,d,d,d,d,d,d, ,d,d,d, , , , , ,#
+ , , , , ,d,d,d, ,d,d,d, ,d, ,d,d,d,d, ,d,d,d, ,d, , , , , , ,d, , ,d,d,d, , ,d, , , , , , ,d, ,d,d,d, ,d,d,d,d, ,d, ,d,d,d, ,d,d,d, , , , , ,#
+ ,d,d,d, , ,d, , , , , , ,d, , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , ,d, , , , , , ,d, , ,d,d,d, ,#
+ ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, ,#
+ ,d,d,d, , ,d, , , , , , ,d, , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , ,d, , , , , , ,d, , ,d,d,d, ,#
+ , , , , ,d,d,d, ,d,d,d, ,d, ,d,d,d,d, ,d,d,d, ,d, , , , , , ,d, , ,d,d,d, , ,d, , , , , , ,d, ,d,d,d, ,d,d,d,d, ,d, ,d,d,d, ,d,d,d, , , , , ,#
+ , , , , ,d,d,d, ,d,d,d,d,d,d,d,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d,d,d,d,d,d,d,d, ,d,d,d, , , , , ,#
+ , , , , ,d,d,d, ,d,d,d, ,d, ,d,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, ,d,d,d,d, ,d, ,d,d,d, ,d,d,d, , , , , ,#
+ , , , , , , , , , , , , ,d, , , , , , ,d,d,d, ,d, ,d,d,d, , , , , ,d,d,d, , , , , ,d,d,d, ,d, ,d,d,d, , , , , , ,d, , , , , , , , , , , , , ,#
+ , , , , , , , , , , , ,d,d,d, ,d,d,d, , ,d, , ,d, , ,d, , ,d,d,d, ,d,d,d, ,d,d,d, , ,d, , ,d, , ,d, , ,d,d,d, ,d,d,d, , , , , , , , , , , , ,#
+ , , , , , , , , , , , ,d,d,d, ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, ,d,d,d, ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, ,d,d,d, , , , , , , , , , , , ,#
+ , , , , , , , , , , , ,d,d,d, ,d,d,d, , ,d, , ,d, , ,d, , ,d,d,d, ,d,d,d, ,d,d,d, , ,d, , ,d, , ,d, , ,d,d,d, ,d,d,d, , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, , , , , ,d,d,d, , , , , ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , ,d,d,d,d,d,d,d,d,d,d,d, , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d, , ,d, , ,d,d,d, , ,d, , ,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d,d,d, ,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , , ,d,d, ,d,d,d, ,d,d, , , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d,d, ,d,d,d, ,d,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d,d,d,d, ,d,d,d, ,d,d,d,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, ,d,d,d, ,d,d, ,d,d,d, ,d,d, ,d,d,d, ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d,d,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,i,i,i,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,i,i,i,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,i,i,i,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+"#build label(furniture) start(36;73) 97 doors; 95 beds, coffers, and cabinets; 190 urns; 14 tables, chairs, weapon racks, armor stands, and statues"
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,h,`,f, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,`,b,`, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,n,`,n, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,f,`,n, ,`, ,n,`,f, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,`,b,`,d,`,d,`,b,`, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,h,`,n, ,`, ,n,`,h, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,`, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,h,`,f, ,`, ,h,`,f, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,`,b,`, ,`, ,`,b,`, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,n,`,n, ,`, ,n,`,n, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , ,f,`,n, , ,d, , ,`, , ,d, , ,n,`,f, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , ,`,b,`,d,`,`,`,`,`,`,`,`,`,d,`,b,`, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , ,h,`,n, , ,d, , ,`, , ,d, , ,n,`,h, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,n,`,n, ,`, ,n,`,n, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , ,h,`,f, ,r,b,t, ,`, ,r,b,t, ,h,`,f, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , ,`,b,`, ,a,`,c, ,`, ,a,`,c, ,`,b,`, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , ,n,`,n, ,h,s,f, ,`, ,h,s,f, ,n,`,n, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , , ,`, , , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,h,`,f, ,f,`,n, ,`, ,n,r,a,h, ,`, ,h,a,r,n, ,`, ,n,`,f, ,h,`,f, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,`,b,`, ,`,b,`,d,`,d,`,b,`,s, ,`, ,s,`,b,`,d,`,d,`,b,`, ,`,b,`, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,n,`,n, ,h,`,n, ,`, ,n,t,c,f, ,`, ,f,c,t,n, ,`, ,n,`,h, ,n,`,n, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , ,f,`,n, , ,d, , , , , , ,`, , , , , , ,`, , , , , , ,`, , , , , , ,d, , ,n,`,f, , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , ,`,b,`,d,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,d,`,b,`, , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , ,h,`,n, , ,d, , , , , , ,`, , , , , ,`,`,`, , , , , ,`, , , , , , ,d, , ,n,`,h, , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,n,`,n, ,f,`,n, ,`, ,n,`,f, ,`,`,`, ,f,`,n, ,`, ,n,`,f, ,n,`,n, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,`,b,`, ,`,b,`,d,`,d,`,b,`, ,`,`,`, ,`,b,`,d,`,d,`,b,`, ,`,b,`, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,h,`,f, ,h,`,n, ,`, ,n,`,h, ,`,`,`, ,h,`,n, ,`, ,n,`,h, ,h,`,f, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , ,`,`,`, , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , ,h,`,f, ,n,`,n, ,f,n, ,`,`,`, ,n,f, ,n,`,n, ,h,`,f, , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , ,`,b,`, ,`,b,`, ,b,`,d,`,`,`,d,`,b, ,`,b,`, ,`,b,`, , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , ,n,`,n, ,h,`,f, ,h,n, ,`,`,`, ,n,h, ,h,`,f, ,n,`,n, , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , , ,d, , ,`,`,`, , ,d, , , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,f,`,n, ,`, ,n,`,f, ,n,`,n, ,`,`,`, ,n,`,n, ,f,`,n, ,`, ,n,`,f, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,`,b,`,d,`,d,`,b,`, ,h,b,f, ,`,`,`, ,h,b,f, ,`,b,`,d,`,d,`,b,`, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,h,`,n, ,`, ,n,`,h, , ,d, , ,`,`,`, , ,d, , ,h,`,n, ,`, ,n,`,h, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , ,`, , , , , ,n,`,n, ,`,`,`, ,n,`,n, , , , , ,`, , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,h,`,f, ,`, ,h,`,f, ,`,b,`, ,`,`,`, ,`,b,`, ,h,`,f, ,`, ,h,`,f, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,`,b,`, ,`, ,`,b,`, ,h,`,f, ,`,`,`, ,h,`,f, ,`,b,`, ,`, ,`,b,`, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,n,`,n, ,`, ,n,`,n, , , , , ,`,`,`, , , , , ,n,`,n, ,`, ,n,`,n, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , ,h,`,f, ,f,`,n, , ,d, , ,`, , ,d, , ,n,`,f, ,`,`,`, ,f,`,n, , ,d, , ,`, , ,d, , ,n,`,f, ,h,`,f, , , , , , , , , , , , ,#
+ , , , , , , , , , , , ,`,b,`, ,`,b,`,d,`,`,`,`,`,`,`,`,`,d,`,b,`, ,`,`,`, ,`,b,`,d,`,`,`,`,`,`,`,`,`,d,`,b,`, ,`,b,`, , , , , , , , , , , , ,#
+ , , , , , , , , , , , ,n,`,n, ,h,`,n, , ,d, , ,`, , ,d, , ,n,`,h, ,`,`,`, ,h,`,n, , ,d, , ,`, , ,d, , ,n,`,h, ,n,`,n, , , , , , , , , , , , ,#
+ , , , , , , , , , , , , ,d, , , , , , ,n,`,n, ,`, ,n,`,n, , , , , ,`,`,`, , , , , ,n,`,n, ,`, ,n,`,n, , , , , , ,d, , , , , , , , , , , , , ,#
+ , , , , ,h,`,f, ,f,`,n, ,`, ,n,r,a,h, ,r,b,t, ,`, ,`,b,`, ,h,b,f, ,`,`,`, ,h,b,f, ,`,b,`, ,`, ,r,b,t, ,h,a,r,n, ,`, ,n,`,f, ,h,`,f, , , , , ,#
+ , , , , ,`,b,`, ,`,b,`,d,`,d,`,b,`,s, ,a,`,c, ,`, ,h,`,f, ,n,`,n, ,`,`,`, ,n,`,n, ,h,`,f, ,`, ,a,`,c, ,s,`,b,`,d,`,d,`,b,`, ,`,b,`, , , , , ,#
+ , , , , ,n,`,n, ,h,`,n, ,`, ,n,t,c,f, ,h,s,f, ,`, , , , , , ,d, , ,`,`,`, , ,d, , , , , , ,`, ,h,s,f, ,f,c,t,n, ,`, ,n,`,h, ,n,`,n, , , , , ,#
+ ,f,`,n, , ,d, , , , , , ,`, , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , ,`, , , , , , ,d, , ,n,`,f, ,#
+ ,`,b,`,d,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,d,`,b,`, ,#
+ ,h,`,n, , ,d, , , , , , ,`, , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , ,`, , , , , , ,d, , ,n,`,h, ,#
+ , , , , ,n,`,n, ,f,`,n, ,`, ,n,r,a,h, ,h,s,f, ,`, , , , , , ,d, , ,`,`,`, , ,d, , , , , , ,`, ,h,s,f, ,h,a,r,n, ,`, ,n,`,f, ,n,`,n, , , , , ,#
+ , , , , ,`,b,`, ,`,b,`,d,`,d,`,b,`,s, ,a,`,c, ,`, ,h,`,f, ,n,`,n, ,`,`,`, ,n,`,n, ,h,`,f, ,`, ,a,`,c, ,s,`,b,`,d,`,d,`,b,`, ,`,b,`, , , , , ,#
+ , , , , ,h,`,f, ,h,`,n, ,`, ,n,t,c,f, ,r,b,t, ,`, ,`,b,`, ,h,b,f, ,`,`,`, ,h,b,f, ,`,b,`, ,`, ,r,b,t, ,f,c,t,n, ,`, ,n,`,h, ,h,`,f, , , , , ,#
+ , , , , , , , , , , , , ,d, , , , , , ,n,`,n, ,`, ,n,`,n, , , , , ,`,`,`, , , , , ,n,`,n, ,`, ,n,`,n, , , , , , ,d, , , , , , , , , , , , , ,#
+ , , , , , , , , , , , ,n,`,n, ,f,`,n, , ,d, , ,`, , ,d, , ,n,`,f, ,`,`,`, ,f,`,n, , ,d, , ,`, , ,d, , ,n,`,f, ,n,`,n, , , , , , , , , , , , ,#
+ , , , , , , , , , , , ,`,b,`, ,`,b,`,d,`,`,`,`,`,`,`,`,`,d,`,b,`, ,`,`,`, ,`,b,`,d,`,`,`,`,`,`,`,`,`,d,`,b,`, ,`,b,`, , , , , , , , , , , , ,#
+ , , , , , , , , , , , ,h,`,f, ,h,`,n, , ,d, , ,`, , ,d, , ,n,`,h, ,`,`,`, ,h,`,n, , ,d, , ,`, , ,d, , ,n,`,h, ,h,`,f, , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,n,`,n, ,`, ,n,`,n, , , , , ,`,`,`, , , , , ,n,`,n, ,`, ,n,`,n, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,`,b,`, ,`, ,`,b,`, ,h,s,f, ,`,`,`, ,h,s,f, ,`,b,`, ,`, ,`,b,`, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,h,`,f, ,`, ,h,`,f, ,a,`,c, ,`,`,`, ,a,`,c, ,h,`,f, ,`, ,h,`,f, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , ,`, , , , , ,r,b,t,d,`,`,`,d,r,b,t, , , , , ,`, , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,f,`,n, ,`, ,n,`,f, ,n,`,n, ,`,`,`, ,n,`,n, ,f,`,n, ,`, ,n,`,f, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,`,b,`,d,`,d,`,b,`, , ,d, , ,`,`,`, , ,d, , ,`,b,`,d,`,d,`,b,`, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , ,h,`,n, ,`, ,n,`,h, ,`,`,`, ,`,`,`, ,`,`,`, ,h,`,n, ,`, ,n,`,h, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , ,d, , , , , , ,`,`, ,`,`,`, ,`,`, , , , , , ,d, , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , ,n,`,n, ,f,`,n, ,`,`, ,`,`,`, ,`,`, ,n,`,f, ,n,`,n, , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , ,`,b,`, ,`,b,`,d,`,`, ,`,`,`, ,`,`,d,`,b,`, ,`,b,`, , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , ,h,`,f, ,h,`,n, ,`,`, ,`,`,`, ,`,`, ,n,`,h, ,h,`,f, , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,`,`,`, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+#query label(rooms) start(36;73) message(use burial script to mark urns as usable) room designations
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,r+,, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,r+,, , , , ,r+,, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,r+,, , , , ,r+,, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , ,r+,, , , , , , , , , , , , ,r+,, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,r+,, , , , ,r+,, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , ,r+,, , , , , , , , , , , , ,r+,, , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , ,r+,, , ,r+,, , , , ,r+,, , , , , , ,r+,, , , , ,r+,, , ,r+,, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , ,r+,, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,r+,, , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , ,r+,, , ,r+,, , , , ,r+,, , , , , , ,r+,, , , , ,r+,, , ,r+,, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , ,r+,, , ,r+,, ,r+,, , , , , , ,r+,, ,r+,, , ,r+,, , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , ,r+,, , , , ,r+,, , ,r+,, , , , , , ,r+,, , ,r+,, , , , ,r+,, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,r+,, , , , , , ,r+,, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , ,r+,, , , , ,r+,, , , , , , , , , , , , , , ,r+,, , , , ,r+,, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , ,r+,, , ,r+,, , , , , , , , , , , , ,r+,, , , , , , ,r+,, , , , , , , , , , , , ,r+,, , ,r+,, , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , ,r+,, , , , ,r+,, , ,r+,, , , , , , ,r+,, , ,r+,, , , , ,r+,, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , ,r+,, , ,r+,, , , , ,r+,, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,r+,, , , , ,r+,, , ,r+,, , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , ,r+,, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,r+,, ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , ,r+,, , ,r+,, , , , ,r+,, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,r+,, , , , ,r+,, , ,r+,, , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , ,r+,, , , , ,r+,, , ,r+,, , , , , , ,r+,, , ,r+,, , , , ,r+,, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , ,r+,, , ,r+,, , , , , , , , , , , , ,r+,, , , , , , ,r+,, , , , , , , , , , , , ,r+,, , ,r+,, , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , ,r+,, , , , ,r+,, , , , , , , , , , , , , , ,r+,, , , , ,r+,, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,r+,, , , , , , ,r+,, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , ,r+,, , , , ,r+,, , , , , , , , , , , , , , ,r+,, , , , ,r+,, , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , ,r+,, , ,r+,, , , , , , , , , , , , ,r+,, , ,r+,, , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,~,~,~, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,~,~,~, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,~,~,~, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
diff --git a/data/blueprints/library/dreamfort.csv b/data/blueprints/library/dreamfort.csv
new file mode 100644
index 000000000..1c0222477
--- /dev/null
+++ b/data/blueprints/library/dreamfort.csv
@@ -0,0 +1,2040 @@
+#notes label(help) run me for the dreamfort walkthrough
+Welcome to the Dreamfort Walkthrough!
+It can be difficult applying a set of blueprints that you did not write yourself. This walkthrough will guide you through the high-level steps of building Dreamfort. Each level also has its own mini-walkthrough with specific steps for that level.
+""
+"The final fort will have a walled-in area on the surface for livestock, trading, and military. One z-level down is the farming level, with related workshops and vents up to the surface for miasma control. The farming level also has a miniature dining hall and dormitory for use until you get the services and housing levels set up."
+""
+"Beyond those two, the other layers can be built in any order, at any z-level, according to your preference and the layout peculiarities of your embark site:"
+"- The industry level has a compact, but complete set of workshops and stockpiles (minus what is already provided on the farming level)."
+"- The services level has dining, hospital, and justice services, including a well system. This level is 4 z-levels deep."
+"- The guildhall level has many empty rooms for building libraries, temples, and guildhalls."
+- The suites level has fancy rooms for your nobles.
+- The apartments level(s) has small but well-furnished bedrooms for your other dwarves.
+""
+"Run each level's ""help"" blueprint (e.g. /surface_help) for more details."
+""
+"Dreamfort has a central staircase-based design. For all Dreamfort levels, place the cursor on the center staircase tile when you apply the blueprints. The first surface blueprint will designate a column of staircases that you can use as a guide."
+""
+"Dreamfort blueprints take care of everything to get the fort up and running. You don't need to clear any trees or create any extra buildings or stockpiles (though of course you are free to do so). Blueprints that do require manual steps (like 'assign minecart to hauling route') will leave a message telling you so when you run them. Blueprints will also leave messages with hints when you might want to run ""quickfort orders"" to start manufacturing needed items."
+""
+"Dreamfort works best at an embark site that is flat and has at least one soil layer. New players should also avoid aquifers if they are not prepared to deal with them. Bring picks for mining, an axe for woodcutting, and an anvil for a forge."
+""
+"Directly after embark, apply /surface1 on the surface (see /surface_help for how to select a good spot) and /industry1 on a level least two z-levels underground (the z-level immediately below the surface is reserved for the farming level). The walkthroughs for those levels will guide you. Once you channel out parts of the surface with /surface3, you can start the farming sequence on the z-level below the surface with /farming1. You can start the services, guildhall, suites, and apartments sequences as your fort needs those levels."
+""
+"This .csv file is generated from source .xlsx files. If you want to look at how these blueprints are put together, it will be easier to look at the online spreadsheets than this giant .csv. You can view them at: https://drive.google.com/drive/folders/1iS90EEVqUkxTeZiiukVj1pLloZqabKuP"
+You are welcome to copy those spreadsheets and make your own modifications!
+"#dreamfort.csv is generated with the following command:
+ for fname in dreamfort*.xlsx; do xlsx2csv -a -p '' $fname; done | sed 's/,*$//'"
+#notes label(surface_help)
+"Sets up a large, protected entrance to your fort in a flat area on the surface."
+""
+Features:
+- A starting set of workshops and stockpiles (which you can later remove once you establish your permanent workshops and storage)
+- Trade depot area
+"- Walls, roof, and lever-controlled gates for security"
+- Trap-filled hallways for invaders
+- Livestock grazing area with nestbox zones and beehives
+- A grid of 1x1 farm plots (meant to be managed with DFHack autofarm)
+- An extra room near the entrance for a barracks (once you get your military going)
+- Miasma vents for the farming level that is intended to be built in the layer directly beneath the surface
+""
+Manual steps you have to take:
+- Assign grazing livestock to the large pasture and dogs to the pasture over the stairwell (DFHack's autonestbox can manage the nestbox zones)
+- Connect levers to the gates
+""
+Be sure to choose an embark site that has an area flat enough to use these blueprints!
+""
+Surface Walkthrough:
+"1) Choose a tile for your central staircase. The terrain around that tile should be perfectly flat. Trees are ok, but no slopes, rivers, or lakes. To be sure that the tile you've chosen is in a good spot, set the cursor over that tile and run ""quickfort run library/dreamfort.csv -n /surface4"". This will show you the eventual boundaries of the fort. Some wall segments might be missing due to existing trees, but that's ok. Make sure the area within the exterior wall is flat. Run ""quickfort undo library/dreamfort.csv -n /surface4"" to clean up."
+""
+"2) With the cursor on the chosen tile, run /surface1 to clear surrounding trees and set up your pastures. Remember to assign your dogs to the pasture around the staircase and your grazing animals to the large pasture. You can let your cats roam free."
+""
+"3) Once the trees have been cleared, run /surface2 to set up starting workshops/stockpiles and clear trees from a larger area. Run ""quickfort orders"" for /surface4, /surface5, and /surface6 to get a head start manufacturing items for those blueprints. If you want a consistent color for your walls and floors, remember to set the rock material in the buildingplan UI and in the manager orders for the blocks."
+""
+"4) Once the trees have been cleared from the larger area, run /surface3 to channel out the miasma vents for the farming level."
+""
+"5) When the channels have been dug, run /surface4 to build the protective walls and flooring. You can also start digging out the sub-surface farming level (/farming1) at this point. Although the vents will be covered with flooring, they will still work to prevent miasma."
+""
+"6) Once all the constructions are built, run /surface5 build gates, furniture, the trade depot, and traps."
+""
+"7) When at least the beehives are in place, run /surface6 to configure the hives and construct a roof."
+"#meta label(surface1) start(staircase center)
+message(Once the stairwell is mined out, you should start digging the industry level in a non-aquifer rock layer.
+Once the area is clear of trees, continue with /surface2.) clear trees and set up pastures"
+stair_guide/surface_stair_guide
+clear_small/surface_clear_small
+zones/surface_zones
+""
+"#meta label(surface2) start(staircase center) message(This would be a good time to queue manager orders for /surface4, /surface5, and /surface6. If you want a consistent color for your walls, remember to set the rock material in the buildingplan UI and in the manager orders for blocks.
+Once the whole area is clear of trees, continue with /surface3.) set up starting workshops/stockpiles and clear a larger area"
+build_start/surface_build_start
+place_start/surface_place_start
+query_start/surface_query_start
+clear/surface_clear
+pick/surface_pick
+""
+"#meta label(surface3) start(staircase center) message(Once the channels are dug out, continue with /surface4. You can also start digging out the sub-surface farming level once the channels are done.) channel to prevent miasma in the sub-surface farming level"
+dig/surface_channel
+""
+"#meta label(surface4) start(staircase center) message(Once floors and walls are built, continue with /surface5.) cover up the holes with flooring and build walls"
+build_floors/surface_floors
+build_walls/surface_walls
+""
+"#meta label(surface5) start(staircase center) message(Once buildings have been constructed, continue with /surface6) build gates, furniture, the trade depot, and traps"
+build_bridges/surface_gates
+build_buildings/surface_buildings
+""
+"#meta label(surface6) start(staircase center on ground level) message(The surface is secure! If you like, you can build a barracks in the empty entranceway room.) configure hives, build the roof"
+query_buildings/surface_query_buildings
+build_scaffolding/surface_scaffolding
+#<
+build_roof/surface_roof
+#dig label(surface_stair_guide) hidden() use the meta blueprints for normal application
+j
+#>
+i
+#>
+i
+#>
+i
+#>
+i
+#>
+i
+#>
+i
+#>
+i
+#>
+i
+#>
+i
+#>
+i
+#>
+i
+#>
+i
+#>
+i
+#>
+i
+#dig label(surface_clear_small) start(23; 25) hidden() use the meta blueprints for normal application
+
+
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,`
+,,,,,,`,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,`
+,,,,,,`,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,`
+,,,,,,`,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,`
+,,,,,,`,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,`
+,,,,,,`,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,`
+,,,,,,`,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,`
+,,,,,,`,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,`
+,,,,,,`,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,`
+,,,,,,`,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,`
+,,,,,,`,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,`
+,,,,,,`,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,`
+,,,,,,`,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,`
+,,,,,,`,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,`
+,,,,,,`,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,`
+,,,,,,`,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,`
+,,,,,,`,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,`
+,,,,,,`,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,`
+,,,,,,`,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,`
+,,,,,,`,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,`
+,,,,,,`,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,`
+,,,,,,`,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,j,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,`
+,,,,,,`,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,`
+,,,,,,`,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,,`,`,,,,,,,,`,`,,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,,`,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,,`,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,,`,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,,`,,,,,,,,,,,,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,`,`,,,,,,,,`,`
+,,,,,,,,,,,,,,,,,`,`,,,,,,,,`,`
+,,,,,,,,,,,,,,,,,`,`,,,,,,,,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,`,,,,,,,,`
+,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`
+
+
+#zone label(surface_zones) start(23; 25) hidden() message(remember to assign your dogs to the staircase pasture and your grazing animals to the large pasture) use the meta blueprints for normal application
+
+
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,gnm(31x17),,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,n(1x1),n(1x1),n(1x1),n(1x1),n(1x1),n(1x1),n(1x1),n(1x1),n(1x1),n(1x1),n(1x1),n(1x1),,,,,,,,n(1x1),n(1x1),n(1x1),n(1x1),n(1x1),n(1x1),n(1x1),n(1x1),n(1x1),n(1x1),n(1x1),n(1x1),`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,,,,,,,,,,,,,`,n(5x5),,,,,`,t(12x5),,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,`,`,`,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,`,,`,`,`,,`,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,`,`,`,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,`,,,,,,`,,,,,,,,,,,,,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,,`,`,,,,,,,,`,`,,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,,`,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,,`,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,,`,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,,`,,,,,,,,,,,,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,`,`,,,,,,,,`,`
+,,,,,,,,,,,,,,,,,`,`,,,,,,,,`,`
+,,,,,,,,,,,,,,,,,`,`,,,,,,,,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,`,,,,,,,,`
+,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`
+
+
+
+#build label(surface_build_start) start(23; 25) hidden() use the meta blueprints for normal application
+
+
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,D,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,wr,,,,wc,,,,wm,,,,wt,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),`,,,,,,`,,,,,,,,,,,,,`
+,,,,,,`,p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),,,`,`,`,,,,,,,,,,,,,,,`
+,,,,,,`,p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),`,,`,`,`,,`,,,,,,,,,,,,,`
+,,,,,,`,p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),,,`,`,`,,,,,,,,,,,,,,,`
+,,,,,,`,p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),p(1x1),`,,,,,,`,,,,,,,,,,,,,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,,`,`,,,,,,,,`,`,,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,,`,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,,`,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,,`,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,,`,,,,,,,,,,,,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,`,`,,,,,,,,`,`
+,,,,,,,,,,,,,,,,,`,`,,,,,,,,`,`
+,,,,,,,,,,,,,,,,,`,`,,,,,,,,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,`,,,,,,,,`
+,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`
+
+
+
+#place label(surface_place_start) start(23; 25) hidden() use the meta blueprints for normal application
+
+
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,f(4x4),,,,w(4x4),,,,f(4x4),,,,,s(4x4),,,,gunbzSpd(4x4),,,,hl(4x4),,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,,,,,,,,,,,,,`,,,,,,`,a(12x5),,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,`,`,`,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,`,,`,`,`,,`,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,`,`,`,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,`,,,,,,`,,,,,,,,,,,,,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,,`,`,,,,,,,,`,`,,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,,`,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,,`,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,,`,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,,`,,,,,,,,,,,,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,`,`,,,,,,,,`,`
+,,,,,,,,,,,,,,,,,`,`,,,,,,,,`,`
+,,,,,,,,,,,,,,,,,`,`,,,,,,,,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,`,,,,,,,,`
+,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`
+
+
+
+#query label(surface_query_start) start(23; 25) hidden() use the meta blueprints for normal application
+
+
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,forbidbooze,,,,,,,,booze,,,,,otherstone,,,,,,,,,,,,,,,`
+,,,,,,`,,,,nocontainers,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,,,,,,,,,,,,,`,,,,,,`,forbidcages,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,`,`,`,,,forbidtraps,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,`,,`,`,`,,`,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,`,`,`,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,`,,,,,,`,,,,,,,,,,,,,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,,`,`,,,,,,,,`,`,,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,,`,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,,`,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,,`,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,,`,,,,,,,,,,,,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,`,`,,,,,,,,`,`
+,,,,,,,,,,,,,,,,,`,`,,,,,,,,`,`
+,,,,,,,,,,,,,,,,,`,`,,,,,,,,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,`,,,,,,,,`
+,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`
+
+
+
+#dig label(surface_clear) start(23; 25) hidden() use the meta blueprints for normal application
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,`,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t,t
+#dig label(surface_pick) start(23; 25) hidden() use the meta blueprints for normal application
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p
+#dig label(surface_channel) start(23; 25) hidden() use the meta blueprints for normal application
+
+
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,h,,,,h,,,,,,,,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,,,,,,,,,,,,,`,,,,,,`,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,j,j,j,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,`,,j,j,j,,`,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,j,j,j,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,`,,,,,,`,,,,,,,,,,,,,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,h,h,,`,`,`,h,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,,`,`,,,,,,,h,h,,h,`,`,h,`,h,`,`,`,`,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,h,h,,,,,h,,`,,,,,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,,`,,,,,,,`,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,h,h,h,h,h,h,h,h,h,h,h,h,h,h
+,,,,,,`,,,,,,,,,,,,,,,,,,,h,h,h,h,h,h,h,h,h,h,h,h,h,h
+,,,,,,`,,,,,,,,,,,,,,,,,,,h,h,h,h,h,h,h,h,h,h,h,h,h,h
+,,,,,,`,,,,,,,,,,,,`,,,,,,,h,h,h,h,h,h,h,h,h,h,h,h,h,h
+,,,,,,`,,,,,,,,,,,,`,,,,,,,h,h,h,h,h,h,h,h,h,h,h,h,h,h
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,h,h,h,,h,h,h,h,h,h,h,h,h,h,h,h,h,h
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,h,h,h,,h,h,h,h,h,h,h,h,h,h,h,h,h,h
+,,,,,,,,,,,,,,,,,`,`,,,h,h,h,,h,h,h,h,h,h,h,h,h,h,h,h,h,h
+,,,,,,,,,,,,,,,,,`,`,,,,,,,h,h,h,h,h,h,h,h,h,h,h,h,h,h
+,,,,,,,,,,,,,,,,,`,`,,,,h,,,h,h,h,h,h,h,h,h,h,h,h,h,h,h
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`
+,,,,,,,,,,,,,,,,,,`,,,,,,,,`
+,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`
+
+
+
+#build label(surface_floors) start(23; 25) hidden() use the meta blueprints for normal application
+
+
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,Cf,,,,Cf,,,,,,,,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,Cf,`,Cf,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,,,,,,,,,,,,,`,Cf,Cf,Cf,Cf,Cf,`,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,Cf,Cf,`,`,`,Cf,Cf,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,`,Cf,`,`,`,Cf,`,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,Cf,Cf,`,`,`,Cf,Cf,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,`,Cf,Cf,Cf,Cf,Cf,`,,,,,,,,,,,,,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,Cf,`,`,`,`,Cf,`,Cf,`,`,`,`,Cf,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,Cf,`,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,`,Cf,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf
+,,,,,,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf
+,,,,,,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,,,,,,,,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+
+
+
+
+
+#build label(surface_walls) start(23; 25) hidden() use the meta blueprints for normal application
+
+
+,,,,,,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw
+,,,,,,Cw,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Cw
+,,,,,,Cw,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Cw
+,,,,,,Cw,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Cw
+,,,,,,Cw,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Cw
+,,,,,,Cw,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Cw
+,,,,,,Cw,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Cw
+,,,,,,Cw,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Cw
+,,,,,,Cw,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Cw
+,,,,,,Cw,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Cw
+,,,,,,Cw,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Cw
+,,,,,,Cw,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Cw
+,,,,,,Cw,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Cw
+,,,,,,Cw,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Cw
+,,,,,,Cw,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Cw
+,,,,,,Cw,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Cw
+,,,,,,Cw,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Cw
+,,,,,,Cw,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Cw
+,,,,,,Cw,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Cw
+,,,,,,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,,Cw,,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw
+,,,,,,Cw,,,,,,,,,,,,,Cw,,,,,,Cw,,,,,,,,,,,,,Cw
+,,,,,,Cw,,,,,,,,,,,,,,,`,`,`,,,,,,,,,,,,,,,Cw
+,,,,,,Cw,,,,,,,,,,,,,Cw,,`,`,`,,Cw,,,,,,,,,,,,,Cw
+,,,,,,Cw,,,,,,,,,,,,,,,`,`,`,,,,,,,,,,,,,,,Cw
+,,,,,,Cw,,,,,,,,,,,,,Cw,,,,,,Cw,,,,,,,,,,,,,Cw
+,,,,,,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,,Cw,Cw,Cw,Cw,,Cw,,Cw,Cw,Cw,Cw,,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw
+,,,,,,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,,Cw,Cw,,`,`,`,`,`,,Cw,Cw,,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw
+,,,,,,Cw,,,,,,,,,,,,Cw,,`,`,`,`,`,,Cw,,,,,,,,,,,,Cw
+,,,,,,Cw,,,,,,,,,,,,Cw,,`,`,`,`,`,,Cw,,,,,,,,,,,,Cw
+,,,,,,Cw,,,,,,,,,,,,`,`,,,,,,`,`,,,,,,,,,,,,Cw
+,,,,,,Cw,,,,,,,,,,,,`,`,,,,,,`,`,,,,,,,,,,,,Cw
+,,,,,,Cw,,,,,,,,,,,,`,`,,,,,,`,`,,,,,,,,,,,,Cw
+,,,,,,Cw,,,,,,,,,,,,Cw,,,,,,,,Cw,,,,,,,,,,,,Cw
+,,,,,,Cw,,,,,,,,,,,,Cw,,,,,,,,Cw,,,,,,,,,,,,Cw
+,,,,,,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,,,,,,,,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw
+,,,,,,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,,,,,,,,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw
+,,,,,,`,`,,,,,,,,,,`,`,,,,,,,,`,`,,,,,,,,,,`,`
+,,,,,,`,`,,,,,,,,,,`,`,,,,,,,,`,`,,,,,,,,,,`,`
+,,,,,,`,`,,,,,,,,,,`,`,,,,,,,,`,`,,,,,,,,,,`,`
+,,,,,,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,,,,,,,,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw
+,,,,,,,,,,,,,,,,,,Cw,,,,,,,,Cw
+,,,,,,,,,,,,,,,,,,Cw,`,`,`,`,`,`,`,Cw
+,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`
+
+
+
+#build label(surface_gates) start(23; 25) hidden() use the meta blueprints for normal application
+
+
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,,,,,,,,,,,,,`,,,,,,`,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,`,`,`,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,`,,`,`,`,,`,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,`,`,`,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,`,,,,,,`,,,,,,,,,,,,,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,,`,`,,gw,gw,gw,gw,gw,,`,`,,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,,,,,,,,,,,,`,,gw,gw,gw,gw,gw,,`,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,`,,gw,gw,gw,gw,gw,,`,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,ga,ga,,,,,,gd,gd,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,ga,ga,,,,,,gd,gd,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,ga,ga,,,,,,gd,gd,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,,`,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,,`,,,,,,,,,,,,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,ga,ga,,,,,,,,,,gd,gd,,,,,,,,ga,ga,,,,,,,,,,gd,gd
+,,,,,,ga,ga,,,,,,,,,,gd,gd,,,,,,,,ga,ga,,,,,,,,,,gd,gd
+,,,,,,ga,ga,,,,,,,,,,gd,gd,,,,,,,,ga,ga,,,,,,,,,,gd,gd
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,`,,,,,,,,`
+,,,,,,,,,,,,,,,,,,`,gw,gw,gw,gw,gw,gw,gw,`
+,,,,,,,,,,,,,,,,,,,gw,gw,gw,gw,gw,gw,gw
+,,,,,,,,,,,,,,,,,,,gw,gw,gw,gw,gw,gw,gw
+
+
+
+#build label(surface_buildings) start(23; 25) hidden() message(Remember to connect the levers to the gates once they are built.) use the meta blueprints for normal application
+
+
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,~h,~h,,,,,,,,,,,,,,,,,,,,,,,,,,,,~h,~h,`
+,,,,,,`,~h,~h,,,,,,,,,,,,,,,,,,,,,,,,,,,,~h,~h,`
+,,,,,,`,~h,~h,,,,,,,,,,,,,,,,,,,,,,,,,,,,~h,~h,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,N,N,N,N,N,N,N,N,N,N,N,N,,,,,,,,N,N,N,N,N,N,N,N,N,N,N,N,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,d,`,d,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,,,,,,,,,,,,,`,Tl,,Tl,,Tl,`,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,d,,`,`,`,,d,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,`,,`,`,`,,`,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,d,,`,`,`,,d,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,`,Tl,Tl,Tl,Tl,Tl,`,,,,,,,,,,,,,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,d,`,`,`,`,d,`,d,`,`,`,`,d,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,d,`,`,,,,,,,,`,`,d,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,,`,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,,`,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,D,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,,`,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,,`,,,,,,,,,,,,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,Tc,Tc,Tc,Tc,Tc,Tc,Tc,Tc,Tc,,,,,,,,,,,,Tc,Tc,Tc,Tc,Tc,Tc,Tc,Tc,Tc
+,,,,,,,,Tc,Tc,Tc,Tc,Tc,Tc,Tc,Tc,Tc,,,,,,,,,,,,Tc,Tc,Tc,Tc,Tc,Tc,Tc,Tc,Tc
+,,,,,,,,Tc,Tc,Tc,Tc,Tc,Tc,Tc,Tc,Tc,,,,,,,,,,,,Tc,Tc,Tc,Tc,Tc,Tc,Tc,Tc,Tc
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,`,,,,,,,,`
+,,,,,,,,,,,,,,,,Tc,Tc,`,,,,,,,,`,Tc,Tc
+,,,,,,,,,,,,,,,,Tc,Tc,,,,,,,,,,Tc,Tc
+,,,,,,,,,,,,,,,,Tc,Tc,,,,,,,,,,Tc,Tc
+,,,,,,,,,,,,,,,,Tc,Tc,,,,,,,,,,Tc,Tc
+
+
+#query label(surface_query_buildings) start(23; 25) hidden() use the meta blueprints for normal application
+
+
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,cg,cg,,,,,,,,,,,,,,,,,,,,,,,,,,,,cg,cg,`
+,,,,,,`,c,c,,,,,,,,,,,,,,,,,,,,,,,,,,,,c,c,`
+,,,,,,`,cg,cg,,,,,,,,,,,,,,,,,,,,,,,,,,,,cg,cg,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,,,,,,,,,,,,,`,,,,,,`,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,`,`,`,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,`,,`,`,`,,`,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,`,`,`,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,`,,,,,,`,,,,,,,,,,,,,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,,`,`,,,,,,,,`,`,,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,,`,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,,`,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,,`,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,,`,,,,,,,,,,,,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+
+
+
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,`,,,,,,,,`
+,,,,,,,,,,,,,,,,,,`,,,,,,,,`
+
+
+
+
+
+#build label(surface_scaffolding) start(23; 25) hidden() use the meta blueprints for normal application
+
+
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,,,,,,,,,,,,,`,,,,,,`,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,`,`,`,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,`,,`,`,`,,`,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,`,`,`,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,`,,,,,,`,,,,,,,,,,,,,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,,`,,`,`,`,`,,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,,`,`,,,,,,,,`,`,,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,,`,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,,`,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,,`,,,,,,,,,,,,`
+,,,,,,`,,,,,,,,,,,,`,,,,,,,,`,,,,,,,,,,,,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+
+
+
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,Cu,`,,,,,,,,`
+,,,,,,,,,,,,,,,,,,`,,,,,,,,`
+
+
+
+
+
+#build label(surface_roof) start(23; 25) hidden() use the meta blueprints for normal application
+
+
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,Cf,`,Cf,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,Cf,Cf,Cf,Cf,Cf,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,Cf,Cf,Cf,Cf,Cf,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,Cf,Cf,Cf,Cf,Cf,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,Cf,`,`,`,`,Cf,`,Cf,`,`,`,`,Cf,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,Cf,`,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,`,Cf,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf
+,,,,,,,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf
+,,,,,,,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf,Cf
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,Cd,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+,,,,,,,,,,,,,,,,,,`,Cf,Cf,Cf,Cf,Cf,Cf,Cf,`
+
+
+
+
+
+#notes label(farming_help)
+"Sets up farming, food storage, and related industries. Also provides post-embark necessities that can later be disassembed."
+""
+Features:
+- Pairs with the surface blueprints to provide miasma vents
+- Farm plots (intended to be managed by DFHack autofarm)
+- Plentiful food storage
+- Refuse stockpile and quantum dump for useless body parts
+- Small dormitory and dining room for post-embark needs
+- Small office for your manager
+""
+Workshops:
+- Kitchen
+- Brewery
+- Butcher
+- Fishery
+- Tannery
+- Farmer's Workshop
+- Quern
+- Screw Press
+""
+Manual steps you have to take:
+- Assign the office to your manager
+- Assign a minecart to your quantum garbage stockpile hauling route
+"- If the industry level is already built, configure the jugs, pots, and bags stockpiles to take from the ""Goods"" quantum stockpile on the industry level"
+""
+Farming Walkthough:
+"1) Wait until you have completed /surface3 before digging out the farming level on the z-level below the surface, otherwise you will likely get caveins as your miners channel out the miasma vents over empty space."
+""
+"2) Start digging with /farming1 and get started on manufacturing furniture by running ""quickfort orders"" on /farming2."
+""
+"3) Once the level is dug out, run /farming2 to build workshops and build and configure stockpiles. Remember to assign a minecart to the newly-designated quantum garbage dump. There are also jugs, pots, and bags stockpiles on this level that should be configured to ""take"" from the industry level stockpiles once we get the industry level built."
+""
+"4) When the furniture is in place, run /farming3 to designate your temporary dining room and dormitory. The blueprint also attempts to assign the office to your manager, but double-check this assignment in case your dwarves are in an unexpected order."
+"#dig label(farming1) start(23; 25; staircase center) message(This would be a good time to queue up manager orders for /farming2. Once the area is dug out, continue with /farming2.)"
+
+
+,,,,,,,,,d,d,d,d,d,d,d,d,d,d,d,,d,,d,,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,,,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,,,,,,d,d,d,d,d,d,d,d,d,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,,,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,,,,,,d,d,d,d,d,d,d,d,d,d,d,,d,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,,,,,,,,d,,,d,,,d,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,,,,,,d,,,,d,,,,d,,,,d,d,d,,,d,,,,d
+,,,,,,,,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,d,,d,d,d,,d,d,d
+,,,,,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,z,d,d,d,z,d
+,,,,,,,,d,d,d,d,d,d,d,d,d,d,d,d,,d,,d,,d,d,d,,d,d,d
+,,,,,,,,,d,,,,d,,,,d,,,,d,d,d,,,d,,,,d
+,,,,,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,i,i,i,d,d,d,d,d,d,d,d,d,d,d
+,,,,,,,,,d,d,d,d,d,d,d,d,d,d,,d,i,i,i,d,,d,d,d,d,d,d,d,d
+,,,,,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,i,i,i,d,d,d,d,d,d,d,d,d,d,d
+,,,,,,,,,,,,,,,,,,,,,d,d,d,,,,,d,,,,,d
+,,,,,,,,,d,d,d,,d,d,d,d,d,d,d,,d,,d,,z,z,d,d,d,,z,d,d,d
+,,,,,,,,,d,d,d,,d,d,d,d,d,d,d,,d,d,d,d,z,z,d,z,d,d,z,d,z,d
+,,,,,,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,,z,z,d,d,d,,z,d,d,d
+,,,,,,,,,d,d,d,,d,d,d,d,d,d,d,,d,d,d,,,,,d,,,,,d
+,,,,,,,,,d,d,d,,d,d,d,d,d,d,d,,d,d,d,,z,z,z,z,z,z,z,z,z,z,z,z,z,z
+,,,,,,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,z,z,z,z,z,z,z,z,z,z,z,z,z,z
+,,,,,,,,,d,d,d,,d,d,d,d,d,d,d,,d,d,d,,z,z,z,z,z,z,z,z,z,z,z,z,z,z
+,,,,,,,,,d,d,d,,d,d,d,d,d,d,d,,d,,d,,z,z,z,z,z,z,z,z,z,z,z,z,z,z
+,,,,,,,,,,,,,,,,,,,,,,,,,z,z,z,z,z,z,z,z,z,z,z,z,z,z
+,,,,,,,,,,,,,,,,,,,,,z,z,z,,z,z,z,z,z,z,z,z,z,z,z,z,z,z
+,,,,,,,,,,,,,,,,,,,,,z,z,z,d,z,z,z,z,z,z,z,z,z,z,z,z,z,z
+,,,,,,,,,,,,,,,,,,,,,z,z,z,,z,z,z,z,z,z,z,z,z,z,z,z,z,z
+,,,,,,,,,,,,,,,,,,,,,,d,,,z,z,z,z,z,z,z,z,z,z,z,z,z,z
+,,,,,,,,,,,,,,,,,,,,,,z,,,z,z,z,z,z,z,z,z,z,z,z,z,z,z
+
+
+"#meta label(farming2) start(staircase center) message(Once furniture has been placed, continue with /farming3.) build workshops and stockpiles, configure stockpiles"
+build_workshops/farming_workshops
+build_furniture/farming_furniture
+place/farming_place
+query_stockpiles/farming_query_stockpiles
+#build label(farming_workshops) start(23; 25) hidden() use the meta blueprints for normal application
+
+
+,,,,,,,,,p(1x3),p(1x3),p(1x3),p(1x3),p(1x3),p(1x3),p(1x3),p(1x3),`,`,`,,`,,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,`,,,`,,,`,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,,,,`,,,,`,,,,`,`,`,,,`,,,,`
+,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,,`,`,`
+,,,,,,,,`,wq,wp,`,`,ww,`,`,`,wl,`,`,`,`,`,`,`,`,wu,`,`,`,wz,`
+,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,,`,,`,,`,`,`,,`,`,`
+,,,,,,,,,`,,,,`,,,,`,,,,`,`,`,,,`,,,,`
+,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,,`,`,`,`,`,`,`,`
+,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,,,`,`,`,,,,,`,,,,,`
+,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,,`,,`,,`,`,`,`,`,,`,`,`,`
+,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,wn,`,`,`,`,wh,`
+,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,,`,`,`,`
+,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,,`,`,`,,,,,`,,,,,`
+,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,,`,,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,,,,`,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,,,,`,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+
+
+#build label(farming_furniture) start(23; 25) hidden() use the meta blueprints for normal application
+
+
+,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,,s,,s,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,d,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,d,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,d,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,d,,,d,,,d,,,,`,`,`,d,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,d,`,`,`,d,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,d,`,`,`,d,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,d,`,`,`,d,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,d,,,,d,,,,d,,,,`,`,`,,,d,,,,d
+,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,,`,`,`
+,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,d,`,`,`,d,`,`,`,d,`,`,`
+,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,,d,,d,,`,`,`,,`,`,`
+,,,,,,,,,d,,,,d,,,,d,,,,`,`,`,,,d,,,,d
+,,,,,,,,s,`,`,`,`,`,`,`,`,`,`,d,`,`,`,`,`,d,`,`,`,`,`,`,`,`,s
+,,,,,,,,,c,t,`,`,`,`,`,`,`,`,,`,`,`,`,`,,`,`,`,`,`,`,`,`
+,,,,,,,,s,`,`,`,`,`,`,`,`,`,`,d,`,`,`,`,`,d,`,`,`,`,`,`,`,`,s
+,,,,,,,,,,,,,,,,,,,,,`,`,`,,,,,d,,,,,d
+,,,,,,,,,b,b,b,,`,`,`,`,`,`,`,,d,,d,,`,`,`,`,`,,`,`,`,`
+,,,,,,,,,b,`,`,,`,`,`,`,`,`,`,,`,`,`,d,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,b,`,`,d,`,c,c,c,c,c,`,d,`,`,`,,`,`,`,`,`,,`,`,`,`
+,,,,,,,,,b,`,h,,`,t,t,t,t,t,`,,`,`,`,,,,,d,,,,,d
+,,,,,,,,,b,`,f,,`,t,t,t,t,t,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,b,`,`,d,`,c,c,c,c,c,`,d,`,`,`,d,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,b,`,`,,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,b,b,b,,`,`,`,`,`,`,`,,s,,s,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,,,`,`,`,d,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,,,,trackstopS,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,,,,`,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+
+
+#place label(farming_place) start(23; 25) hidden() use the meta blueprints for normal application
+
+
+,,,,,,,,,`,`,`,`,`,`,`,`,f(3x6),,,,`,,`,,f(14x16),,,,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,f(8x1),,,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,b(8x1),,,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,`,,,`,,,`,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,f(14x10),,,,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,,,,`,,,,`,,,,`,`,`,,,`,,,,`
+,,,,,,,,u,u,u,u,`,`,`,u(5x3),,,`,`,,`,`,`,,`,`,`,,`,`,`
+,,,,,,,,g,`,`,u,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,g,g,g,g,`,`,`,`,`,`,`,`,,`,,`,,`,`,`,,`,`,`
+,,,,,,,,,`,,,,`,,,,`,,,,`,`,`,,,`,,,,`
+,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,,`,`,`,`,`,`,`,`
+,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,,,`,`,`,,,,,`,,,,,`
+,,,,,,,,,`,`,`,,f(7x2),,,`,`,`,`,,`,,`,,r(2x3),,,`,`,,f(1x3),,,`
+,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,,`,`,`,`
+,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,,`,`,`,,,,,`,,,,,`
+,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,,`,`,`,,ry(14x10),,,,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,`,`,,f(7x2),,,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,,`,,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,,,ry(3x3),,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,,,,`,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,,,,ry,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+
+
+"#query label(farming_query_stockpiles) start(23; 25) hidden() message(remember to:
+- assign a minecart to the garbage quantum stockpile
+- if the industry level is already built, configure the jugs, pots, and bags stockpiles to take from the ""Goods"" quantum stockpile on the industry level) use the meta blueprints for normal application"
+
+
+,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,,`,,`,,forbidplants,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,forbidtallow,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,forbiddye,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,seeds,linksonly,`,`,`,`,`,`,seeds,give2left,nocontainers,`,`,`,`,,forbidunpreparedfish,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,potash,nocontainers,`,`,`,`,`,`,`,`,`,,`,`,`,,forbidmiscliquid,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,`,,,`,,,`,,,,`,`,`,`,forbidpreparedfood,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,plants,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,,,,`,,,,`,,,,`,`,`,,,`,,,,`
+,,,,,,,,bags,nocontainers,`,`,`,`,`,pots,`,`,`,`,,`,`,`,,`,`,`,,`,`,`
+,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,jugs,nocontainers,`,`,`,`,`,`,`,`,`,`,,`,,`,,`,`,`,,`,`,`
+,,,,,,,,,`,,,,`,,,,`,,,,`,`,`,,,`,,,,`
+,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,,`,`,`,`,`,`,`,`
+,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,,,`,`,`,,,,,`,,,,,`
+,,,,,,,,,`,`,`,,preparedfood,`,`,`,`,`,`,,`,,`,,rawhides,`,`,`,`,,unpreparedfish,`,`,`
+,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,nocontainers,`,`,`
+,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,,`,`,`,`
+,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,,`,`,`,,,,,`,,,,,`
+,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,,`,`,`,,give2up,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,`,`,,booze,`,`,`,`,`,`,,`,`,`,,forbidcraftrefuse,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,,`,,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,,,bodyparts,linksonly,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,,,`,`,`,`,give2left,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,,,,"{quantumstopfromnorth name=""Trash Dumper""}",,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,,,,quantum,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+
+
+#query label(farming3) start(23; 25 staircase center) message(Check to ensure the office got assigned to your manager.) configure rooms
+
+
+,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,,`,,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,`,,,`,,,`,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,,,,`,,,,`,,,,`,`,`,,,`,,,,`
+,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,,`,`,`
+,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,,`,,`,,`,`,`,,`,`,`
+,,,,,,,,,`,,,,`,,,,`,,,,`,`,`,,,`,,,,`
+,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,r--&a+&,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,,`,`,`,`,`,`,`,`
+,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,,,`,`,`,,,,,`,,,,,`
+,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,,`,,`,,`,`,`,`,`,,`,`,`,`
+,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,,`,`,`,`
+,,,,,,,,,r++&d,`,`,,`,`,`,r++&h,`,`,`,,`,`,`,,,,,`,,,,,`
+,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,,`,,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,,,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,,,,`,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,,,,,,,,,,,,`,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+
+
+#notes label(industry_help)
+Sets up workshops for all non-farming industries
+""
+Features:
+- Quantum stockpiles
+- Space-efficient layout for all workshops
+with separate stockpiles for:
+- A reserve of uncut gems for strange moods that the jeweler's workshop cannot take from
+- Steel bars and coal so you can see at a glance if you're low on either
+- Liquids that cannot be quantum stockpiled (e.g. lye)
+- Meltable weapons and armor
+""
+Workshops:
+- 3x Mason
+- 4x Craftsdwarf
+- 1x Jeweler
+- 1x Mechanic
+- 4x Smelter
+- 1x Forge
+- 1x Glassmaker
+- 1x Kiln
+- 4x Wood furnace
+- 1x Ashery
+- 1x Soap maker
+- 1x Carpenter
+- 1x Siege workshop
+- 1x Bowyer
+- 1x Dyer
+- 1x Loom
+- 1x Clothier
+""
+""
+Manual steps you have to take:
+- Assign minecarts to your quantum stockpile hauling routes
+"- Give from the ""Goods"" quantum stockpile to the jugs, pots, and bags stockpiles on the farming level"
+"- If desired, set the stockpiles in the bottom right to auto-melt. This results in melting all weapons and armor that are not masterwork steel. This is great for your military, but it takes a *lot* of fuel. If you enable this, be sure you're in a heavily forested area, enable auto-chop, and set up manager orders to keep your coal stocks high."
+- Download automation.json from https://drive.google.com/file/d/17WcN5mK-rnADOm2B_JFpPnByYgkYjxhb/view and put it in your dfhack-config/orders/ directory.
+""
+Industry Walkthrough:
+1) You can start digging out /industry1 immediately after embark. It is best to choose a stone layer at least two layers underground so the boulders can be used by your starting workshops to manufacture needed items.
+""
+"2) Queue up manufacturing by running ""quickfort orders"" on /industry2."
+""
+"3) Once the area is dug out, run /industry2. Remember to assign minecarts to to your quantum stockpile hauling routes, and if the farming level is already built, give from the ""Goods"" quantum stockpile to the jugs, pots, and bags stockpiles on the farming level."
+""
+"4) If you want to automatically melt goblinite and other low-quality weapons and armor, mark the south-east stockpiles for auto-melt."
+""
+"5) Run ""orders import automation"" to use the provided automation.json to take care of your fort's basic needs."
+"#dig label(industry1) start(18; 18; staircase center) message(This would be a good time to queue manager orders for /industry2. Once the area is dug out, continue with /industry2.)"
+
+
+,,,,,,,,,,,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,,,,,,,,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,d,d,d,d,d,,,d,,d,,,d,d,d,d,d,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,d,d,d,,d,d,d,d,d,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,i,i,i,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,d,d,d,d,d,,d,i,i,i,d,,d,d,d,d,d,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,i,i,i,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,d,d,d,,d,d,d,d,d,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,d,d,d,d,d,,,d,,d,,,d,d,d,d,d,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,,,,,,,,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,,,,,,,,d,d,d,d,d,d,d,d,d,d,d,d,d
+
+
+"#meta label(industry2) start(staircase center) build workshops and stockpiles, configure stockpiles"
+build/industry_build
+place/industry_place
+query/industry_query
+#build label(industry_build) start(18; 18) hidden() use the meta blueprints for normal application
+
+
+,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,wm,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,`,`,wr,`,`,wr,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,`,`,`,`,`,`,`,`,`,wj,`,`,`,`,`,`,`,wt,`,`,`,`,`,`,`,`,`
+,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,`,`,wr,`,`,wr,`,`,`,`,`,`,`,trackstopN,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,`,`,`,`,`,`,`,`,`,wm,`,`,`,`,`,`,`,wm,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,wy,`,`,ew,`,`,ew,`,`,`,`,`,`,`,`,`,`,`,`,`,es,`,`,es,`,`,ek,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,,,d,,d,,,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,d,`,,,,`,d,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,wc,`,`,`,trackstopW,`,`,`,`,,`,,`,,`,,`,`,`,`,trackstopE,`,`,`,wf,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,d,`,,,,`,d,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,,,d,,d,,,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,wS,`,`,ew,`,`,ew,`,`,`,`,`,`,`,`,`,`,`,`,`,es,`,`,es,`,`,eg,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,`,`,`,`,`,`,`,`,`,wb,`,`,`,`,`,`,`,wk,`,`,`,`,`,`,`,`,`
+,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,trackstopS,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,`,`,`,`,ws,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,`,`,`,`,`,`,`,`,`,wd,`,`,`,`,`,`,`,wo,`,`,`,`,`,`,`,`,`
+,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,we,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+
+
+#place label(industry_place) start(18; 18) hidden() use the meta blueprints for normal application
+
+
+,,,,,,,,,,,e,e,e,e,e,e,e,e,e,e,e,e,e
+,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,e,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,`,`,`,`,`,`,`,`,`,`,`,`,se(3x3),,,`,`,`,`,`,`,`,`,`,`,`,`
+,,f,`,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`,`,b(1x6)
+,,f,`,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,f,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,f,`,`,`,`,`,`,`,`,`,`,`,,,`,,`,,,`,`,`,`,`,`,`,`,`,`,`,`
+,,f,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`
+,,f,`,`,`,`,`,`,`,afngwS(3x3),,,`,`,`,,,,`,`,`,sbpdz(3x3),,,`,`,`,`,`,`,`,`
+,,f,`,`,`,`,`,f,`,~,~,~,`,,`,,`,,`,,`,~,~,~,`,b,`,`,`,`,`,`
+,,f,`,`,`,`,`,`,`,~,~,~,`,`,`,,,,`,`,`,~,~,~,`,`,`,`,`,`,`,b(1x6)
+,,f,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`
+,,f,`,`,`,`,`,`,`,`,`,`,`,,,`,,`,,,`,`,`,`,`,`,`,`,`,`,`,`
+,,f,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,f,`,`,`,`,`,`,`,`,`,`,`,`,`,rhl(3x3),,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,f,`,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,`,`,`,`,`,pd(6x3),,,~,~,~,`
+,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,~,~,~,`
+,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,r,`,`,`,`,`,`,~,~,~,~,~,~,`
+,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,pd(6x3),,,~,~,~,`
+,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,~,~,~,`
+,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,~,~,~,`
+,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+
+
+"#query label(industry_query) start(18; 18) hidden() message(remember to:
+- assign minecarts to to your quantum stockpile hauling routes
+- if the farming level is already built, give from the ""Goods"" quantum stockpile to the jugs, pots, and bags stockpiles on the farming level
+- if you want to automatically melt goblinite and other low-quality weapons and armor, mark the south-east stockpiles for auto-melt) use the meta blueprints for normal application
+- now that your industry is set up, run ""orders import automation"" to automate your fort's basic needs (download automation.json from https://drive.google.com/file/d/17WcN5mK-rnADOm2B_JFpPnByYgkYjxhb/view?usp=sharing and put it in your dfhack-config/orders/ directory)"
+
+
+,,,,,,,,,,,roughgems,nocontainers,`,`,`,`,t{Down 6}&,`,`,`,`,`,`
+,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,{quantum}g{Up}{Left 5}&,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,"{quantumstopfromsouth name=""Stoneworker quantum""}",`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,`,`,`,`,`,`,`,`,`,`,`,`,otherstone,,,`,`,`,`,`,`,`,`,`,`,`,`
+,,miscliquid,`,`,`,`,`,`,`,`,`,`,`,`,`,~,nocontainers,~,`,`,`,`,`,`,`,`,`,`,`,`,`,steelbars
+,,nocontainers,`,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,,,`,,`,,,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,{cages}{permittraps},,,`,`,`,,,,`,`,`,forbidotherstone,,,`,`,`,`,`,`,`,t{Left 6}{Down}&
+,,`,`,`,`,`,`,{quantum}g{Up 10}{Right 4}&,"{quantumstopfromeast name=""Goods/Wood quantum""}",~,nocontainers,~,`,,`,,`,,`,,`,~,nocontainers,~,"{quantumstopfromwest name=""Metalworker quantum""}",quantum,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,{tallow}{permitdye},,,`,`,`,,,,`,`,`,forbidpotash,,,`,`,`,`,`,`,`,t{Left 6}{Up}&
+,,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,,,`,,`,,,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,craftrefuse,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,~,nocontainers,~,`,`,`,`,`,`,`,`,`,`,`,`,`,coal
+,,,,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,`,`,`,`,`,nocontainers,`,t{Up 7}&,~,~,~,~
+,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,"{quantumstopfromnorth name=""Clothier/Bones quantum""}",`,`,`,`,`,`,{ironweapons}{permitsteelweapons}{forbidmasterworkweapons}{forbidartifactweapons}
+,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,quantum,`,`,`,`,`,`,{ironarmor}{permitsteelarmor},forbidmasterworkarmor,forbidartifactarmor,~,~,~,~
+,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,nocontainers,give2up,t{Up 11}&,~,~,~,~
+,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,{metalweapons}{forbidmasterworkweapons}{forbidartifactweapons}
+,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,metalarmor,forbidmasterworkarmor,forbidartifactarmor,~,~,~,~
+,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,,,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`
+
+
+#notes label(services_help)
+"Sets up public services (dining, hospital, etc.)"
+""
+Features:
+- Spacious dining room (also usable as a tavern)
+- Prepared food and drink stockpiles
+- Well system (bring your own water)
+- Public baths with soap stockpiles
+- Three well-appointed jail cells
+- Hospital with beds and storage
+- Garbage dump
+""
+Manual steps you have to take:
+"- If you want to declare the dining room as a tavern, the bedrooms at the top can be assigned to the tavern as rented rooms."
+"- Configure the soap stockpiles to take from the industry level ""Metalworker"" quantum stockpile (which holds all the bars)"
+"- Activate the bath pond zones when you are ready to fill them with 3-depth water. This is the only really fiddly bit, since you have to carefully disable the pond zone again when the final bucket to bring the water to an even 3-depth is on the way."
+"- Fill the cisterns with water, either with a bucket brigade or by plumbing flowing water. Fill so that there are two z-levels of 7-depth water to prevent muddiness. If you want to fill with buckets, designate a pond zone on the level below the main floor. If you feel adventurous and are experienced with water pressure, you can instead route (depressurized!) water to the second-to-bottom level (the one above the up staircases)."
+""
+Services Walkthough:
+1) Start this level before your fort grows beyond around 50 dwarves so everyone has a place to eat.
+""
+"2) Start digging with /services1. Note that this digs out the main level and three levels below for the well plumbing. Start manufacturing with ""quickfort orders"" on /services2."
+""
+"3) Once the area is dug out, set up the furniture, stockpiles, and hospital and garbage dump zones with /services2. Fill your soap stockpiles around the bath channels by configuring them to take from the bar quantum stockpile (the one on the right near the forge) on the industry level."
+""
+"4) When all furniture is placed, run /services3 to configure your dining room and jail."
+""
+5) Fill the bath and wells with either a bucket brigade or by carefully routing flowing water to them.
+"#dig label(services1) start(23; 22; staircase center) message(This would be a good time to queue manager orders for /services2. Once the area is dug out, continue with /services2.)"
+
+
+,,d,d,d,,,d,d,d,,,d,d,d
+,,d,d,d,,,d,d,d,,,d,d,d
+,,d,d,d,,,d,d,d,,,d,d,d
+,,,d,,,,,d,,,,,d
+,,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,d,d,h,d,d,d,h,d,d,d,h,d,d,,,,d,h,d,d,h,d,d,h,d
+,,d,d,d,d,d,d,d,d,d,d,d,d,d,,,,d,d,d,d,d,d,d,d,d,,,,d,d,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,d,d,d,d,d,d,,,,d,d,d,d,d,d,d,d,d,,,,d,d,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,d,d,d,d,d,d,,,,,,,,d,,,,,,,,d,d,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,d,,d,d,d,d,d,,d,d,d,,d,d,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,h,d,d,d,i,i,i,d,d,d,h,d,d,d,d,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,d,d,d,d,d,d,,d,h,d,,d,i,i,i,d,,d,h,d,,d,d,d,d,h,d,d,d,d
+,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,h,d,d,d,i,i,i,d,d,d,h,d,d,d,d,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,d,,d,d,d,d,d,,d,d,d,,d,d,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,d,d,d,d,d,d,,,,,,,,d,,,,,,,,d,d,d,d,d,d,d,d,d
+,,,,,,d,d,,d,d,,,,,,,,,,,,,,,,,,,,d,d,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,,d,d,d,d,d,d,,,,,,,,,,,,,,,,d,d,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,,d,d,d,d,d,d
+,,d,d,d,d,d,d,,d,d,d,d,d,d
+,,d,d,d,d,d,d,,d,d,d,d,d,d
+,,d,d,d,d,d,d,,d,d,d,d,d,d
+#>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+,,,j,h,j,d,j,h,j,d,j,h,j,,,,,j,h,j,j,h,j,j,h,j
+,,,d,d,d,d,d,d,d,d,d,d,d,,,,,d,d,d,d,d,d,d,d,d
+,,,,,,,,d,,,,,,,,,,,,,,d
+,,,,,,,,d,,,,,,,,,,,,,,d
+,,,,,,,,d,,,,,,,,,,,,d,d,d,d,d
+,,,,,,,,d,,,,,,,,,`,,,d,i,i,i,d,,,`
+,,,,,,,,d,,,,,,,,,`,,,d,i,i,i,d,,,`,,,,,,j,h,j
+,,,,,,,,d,,,,,,,,,`,,,d,i,i,i,d,,,`,,,,,,d,d,d
+,,,,,,,,d,,,,,,,,,,,,d,d,d,d,d,,,,,,,,,,d
+,,,,,,,,d,,,,,,,,,,,,,,d,,,,,,,,,,,,d
+,,,,,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+#>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+,,,i,h5,i,,i,h5,i,,i,h5,i,,,,,i,h5,i,i,h5,i,i,h5,i
+
+
+
+,,,,,,,,,,,,,,,,,,,,d,d,d,d,d
+,,,,,,,,,,,,,,,,,,,,d,i,i,i,d
+,,,,,,,,,,,,,,,,,,,,d,i,i,i,d,,,,,,,,,i,h5,i
+,,,,,,,,,,,,,,,,,,,,d,i,i,i,d
+,,,,,,,,,,,,,,,,,,,,d,d,d,d,d
+#>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+,,,u,d,u,,u,d,u,,u,d,u,,,,,u,d,u,u,d,u,u,d,u
+
+
+
+,,,,,,,,,,,,,,,,,,,,d,d,d,d,d
+,,,,,,,,,,,,,,,,,,,,d,i,i,i,d
+,,,,,,,,,,,,,,,,,,,,d,i,i,i,d,,,,,,,,,u,d,u
+,,,,,,,,,,,,,,,,,,,,d,i,i,i,d
+,,,,,,,,,,,,,,,,,,,,d,d,d,d,d
+
+
+"#meta label(services2) start(staircase center) message(Once furniture has been placed, continue with /services3.) furniture, stockpiles, hospital, garbage dump"
+build/services_build
+place/services_place
+zone/services_zone
+query_stockpiles/services_query_stockpiles
+#build label(services_build) start(23; 22) hidden() use the meta blueprints for normal application
+
+
+,,b,b,b,,,b,b,b,,,b,b,b
+,,`,`,`,,,`,`,`,,,`,`,`
+,,f,`,h,,,f,`,h,,,f,`,h
+,,,d,,,,,d,,,,,d
+,,s,`,`,s,s,`,`,`,s,s,`,`,s
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,s,`,`,`,`,`,`,`,`,`,`,`,s
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,s,`,`,`,`,`,`,`,`,`,`,`,s
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,s,`,`,`,`,`,`,`,`,`,`,`,s
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,s,`,`,`,`,`,`,`,`,`,`,`,s
+,,`,`,l,`,`,`,l,`,`,`,l,`,`,,,,t,l,b,t,l,b,t,l,b
+,,s,`,`,`,`,`,`,`,`,`,`,`,s,,,,c,v,`,c,v,`,c,v,`,,,,f,`,s,s,`,b,b,b,b
+,,`,`,c,t,t,c,`,c,t,t,c,`,`,,,,`,`,`,`,`,`,`,`,`,,,,h,`,`,`,`,`,`,`,b
+,,s,`,c,t,t,c,`,c,t,t,c,`,s,,,,,,,,d,,,,,,,,f,`,`,`,`,`,t,`,b
+,,`,`,c,t,t,c,`,c,t,t,c,`,`,,`,s,`,,`,`,`,`,`,,`,s,`,,`,`,`,`,`,`,`,`,`
+,,s,`,c,t,t,c,`,c,t,t,c,`,`,d,`,`,`,d,`,`,`,`,`,d,`,`,`,d,`,`,`,`,`,`,`,`,R
+,,`,`,c,t,t,c,`,c,t,t,c,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,l,`,`,`,R
+,,s,`,c,t,t,c,`,c,t,t,c,`,`,d,`,`,`,d,`,`,`,`,`,d,`,`,`,d,`,`,`,`,`,`,`,`,R
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,s,`,,`,`,`,`,`,,`,s,`,,`,`,`,`,`,`,`,`,`
+,,h,s,s,h,`,`,`,`,`,h,s,s,h,,,,,,,,`,,,,,,,,f,`,`,`,`,`,t,`,b
+,,,,,,`,`,,`,`,,,,,,,,,,,,,,,,,,,,h,`,`,`,`,`,`,`,b
+,,`,`,`,`,`,`,,`,`,`,`,`,`,,,,,,,,,,,,,,,,f,`,s,s,`,b,b,b,b
+,,`,`,`,`,`,`,,`,`,`,`,`,`
+,,`,`,`,`,`,`,,`,`,`,`,`,`
+,,`,`,`,`,`,`,,`,`,`,`,`,`
+,,`,`,`,`,`,`,,`,`,`,`,`,`
+#>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+,,,`,`,`,`,`,`,`,`,`,`,`,,,,,`,`,`,`,`,`,`,`,`
+,,,`,`,`,`,`,`,`,`,`,`,`,,,,,`,`,`,`,`,`,`,`,`
+,,,,,,,,d,,,,,,,,,,,,,,d
+,,,,,,,,`,,,,,,,,,,,,,,d
+,,,,,,,,`,,,,,,,,,,,,`,`,`,`,`
+,,,,,,,,`,,,,,,,,,`,,,`,`,`,`,`,,,`
+,,,,,,,,`,,,,,,,,,`,,,`,`,`,`,`,,,`,,,,,,`,`,`
+,,,,,,,,`,,,,,,,,,`,,,`,`,`,`,`,,,`,,,,,,`,`,`
+,,,,,,,,`,,,,,,,,,,,,`,`,`,`,`,,,,,,,,,,d
+,,,,,,,,`,,,,,,,,,,,,,,d,,,,,,,,,,,,`
+,,,,,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+
+
+#place label(services_place) start(23; 22) hidden() use the meta blueprints for normal application
+
+
+,,`,`,`,,,`,`,`,,,`,`,`
+,,`,`,`,,,`,`,`,,,`,`,`
+,,`,`,`,,,`,`,`,,,`,`,`
+,,,`,,,,,`,,,,,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,f(1x2),`,`,f(1x2),`,`,f(1x2),,,,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,f(2x1),`,`,f(2x1),`,`,f(2x1),`,`,,,,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,,,,,,,,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,,b(3x5),`,`,,`,`,`,`,`,,b(3x5),`,`,,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,,,,,,,,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,,`,`,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`,`,`
+,,f(6x5),`,`,`,`,`,,f(6x5),`,`,`,`,`,,,,,,,,,,,,,,,,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,,`,`,`,`,`,`
+,,`,`,`,`,`,`,,`,`,`,`,`,`
+,,`,`,`,`,`,`,,`,`,`,`,`,`
+,,`,`,`,`,`,`,,`,`,`,`,`,`
+
+
+#zone label(services_zone) start(23; 22) hidden() message(activate the bath pond zones when you are ready to fill them with 3-depth water) use the meta blueprints for normal application
+
+
+,,`,`,`,,,`,`,`,,,`,`,`
+,,`,`,`,,,`,`,`,,,`,`,`
+,,`,`,`,,,`,`,`,,,`,`,`
+,,,`,,,,,`,,,,,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,`,`,`,`,,,,h(9x11),`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,,,,,,,,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,apPf(1x3),`,`,`,`,`,`,`,`,`,apPf(1x3),`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,~,`,,`,`,`,`,`,,`,~,`,,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,~,`,`,`,`,`,`,`,`,`,~,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,d,,,,,,,,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,,`,`,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,,`,`,`,`,`,`,,,,,,,,,,,,,,,,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,,`,`,`,`,`,`
+,,`,`,`,`,`,`,,`,`,`,`,`,`
+,,`,`,`,`,`,`,,`,`,`,`,`,`
+,,`,`,`,`,`,`,,`,`,`,`,`,`
+
+
+"#query label(services_query_stockpiles) start(23; 22) hidden() message(remember to configure the soap stockpiles to take from the ""Metalworker"" quantum stockpile on the industry level (where all bars are stored)) use the meta blueprints for normal application"
+
+
+,,`,`,`,,,`,`,`,,,`,`,`
+,,`,`,`,,,`,`,`,,,`,`,`
+,,`,`,`,,,`,`,`,,,`,`,`
+,,,`,,,,,`,,,,,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,booze,`,`,booze,`,`,booze,,,,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,preparedfood,t{Down 10}{Left 12}&,t{Down 10}{Left 10}&,preparedfood,t{Down 10}{Left 20}&,t{Down 10}{Left 10}&,preparedfood,t{Down 10}{Left 20}&,t{Down 10}{Left 12}&,,,,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,,,,,,,,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,,soap,`,`,,`,`,`,`,`,,soap,`,`,,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,nocontainers,`,`,`,`,`,`,`,`,`,nocontainers,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,,,,,,,,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,,`,`,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`,`,`
+,,preparedfood,`,`,`,`,`,,booze,`,`,`,`,`,,,,,,,,,,,,,,,,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,,`,`,`,`,`,`
+,,`,`,`,`,`,`,,`,`,`,`,`,`
+,,`,`,`,`,`,`,,`,`,`,`,`,`
+,,`,`,`,`,`,`,,`,`,`,`,`,`
+
+
+#query label(services3) start(23; 22; staircase center) message(the bedrooms are left unconfigured so you can add them as rented rooms for your tavern) set up dining room and jail
+
+
+,,`,`,`,,,`,`,`,,,`,`,`
+,,`,`,`,,,`,`,`,,,`,`,`
+,,`,`,`,,,`,`,`,,,`,`,`
+,,,`,,,,,`,,,,,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,`,r--&j,`,`,r--&j,`,`,r--&j,`,,,,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,r{+ 11}&h,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,,,,,,,,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,,`,`,`,,`,`,`,`,`,,`,`,`,,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,,,,,`,,,,,,,,`,`,`,`,`,`,`,`,`
+,,,,,,`,`,,`,`,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,,`,`,`,`,`,`,,,,,,,,,,,,,,,,`,`,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,,`,`,`,`,`,`
+,,`,`,`,`,`,`,,`,`,`,`,`,`
+,,`,`,`,`,`,`,,`,`,`,`,`,`
+,,`,`,`,`,`,`,,`,`,`,`,`,`
+
+
+#notes label(guildhall_help)
+"Multiple 7x7 rooms for guildhalls, temples, libraries, etc."
+""
+Features:
+"- Big empty rooms. Double-thick walls to ensure engravings add value to the ""correct"" side. Fill with furniture and assign as needed."
+""
+Guildhall Walkthrough:
+"1) Dig out the rooms with /guildhall1 and queue up manufacturing by running ""quickfort orders"" on /guildhall2."
+""
+"2) Once the area is dug out, add in generic furniture with /guildhall2."
+""
+"3) Furnish individual rooms as you need specific guildhalls, libraries, and temples."
+"#dig label(guildhall1) start(25; 25; staircase center) message(This would be a good time to queue manager orders for /guildhall2. Once the area is dug out, continue with /guildhall2.)"
+
+
+,,d,d,d,d,d,d,d,,,,,,d,d,d,d,d,d,d,,,,,,,,d,d,d,d,d,d,d,,,,,,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,,,,,,d,d,d,d,d,d,d,,,,,,,,d,d,d,d,d,d,d,,,,,,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,,,,,,d,d,d,d,d,d,d,,,,,,,,d,d,d,d,d,d,d,,,,,,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,,,,,,d,d,d,d,d,d,d,,,,,,,,d,d,d,d,d,d,d,,,,,,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,,,d,,,d,d,d,d,d,d,d,,,d,d,d,,,d,d,d,d,d,d,d,,,d,,,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,d,d,d,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,,,d,d,d,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,,,d,,,d,d,d,d,d,d,d,,,d,d,d,,,d,d,d,d,d,d,d,,,d,,,d,d,d,d,d,d,d
+,,,,,,,d,,,,d,,,,,,,,d,,,,d,d,d,,,,d,,,,,,,,d,,,,d
+,,,,,,,d,,,,d,,,,,,,,d,,,,d,d,d,,,,d,,,,,,,,d,,,,d
+,,,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,,,,,,,,d,,,,,,,,,,,,d,d,d,,,,,,,,,,,,d
+,,,,,,,,,,,d,,,,,,,,,,,,d,d,d,,,,,,,,,,,,d
+,,d,d,d,d,d,d,d,,,d,,,d,d,d,d,d,d,d,,,d,d,d,,,d,d,d,d,d,d,d,,,d,,,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,,,d,,,d,d,d,d,d,d,d,,,d,d,d,,,d,d,d,d,d,d,d,,,d,,,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,,,d,,,d,d,d,d,d,d,d,,,d,d,d,,,d,d,d,d,d,d,d,,,d,,,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,,,d,,,d,d,d,d,d,d,d,,,d,d,d,,,d,d,d,d,d,d,d,,,d,,,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,,,d,,,d,d,d,d,d,d,d,,,d,d,d,,,d,d,d,d,d,d,d,,,d,,,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,d,d,d,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,,,d,d,d,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,,,d,,,d,d,d,d,d,d,d,,,d,d,d,,,d,d,d,d,d,d,d,,,d,,,d,d,d,d,d,d,d
+,,,,,,,d,,,,d,,,,,,,,d,,,,d,,d,,,,d,,,,,,,,d,,,,d
+,,,,,,,d,,,,d,,,,,,,,d,,,,d,d,d,,,,d,,,,,,,,d,,,,d
+,,,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,i,i,i,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,,d,i,i,i,d,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,i,i,i,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,,,,d,,,,d,,,,,,,,d,,,,d,d,d,,,,d,,,,,,,,d,,,,d
+,,,,,,,d,,,,d,,,,,,,,d,,,,d,,d,,,,d,,,,,,,,d,,,,d
+,,d,d,d,d,d,d,d,,,d,,,d,d,d,d,d,d,d,,,d,d,d,,,d,d,d,d,d,d,d,,,d,,,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,d,d,d,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,,,d,d,d,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,,,d,,,d,d,d,d,d,d,d,,,d,d,d,,,d,d,d,d,d,d,d,,,d,,,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,,,d,,,d,d,d,d,d,d,d,,,d,d,d,,,d,d,d,d,d,d,d,,,d,,,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,,,d,,,d,d,d,d,d,d,d,,,d,d,d,,,d,d,d,d,d,d,d,,,d,,,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,,,d,,,d,d,d,d,d,d,d,,,d,d,d,,,d,d,d,d,d,d,d,,,d,,,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,,,d,,,d,d,d,d,d,d,d,,,d,d,d,,,d,d,d,d,d,d,d,,,d,,,d,d,d,d,d,d,d
+,,,,,,,,,,,d,,,,,,,,,,,,d,d,d,,,,,,,,,,,,d
+,,,,,,,,,,,d,,,,,,,,,,,,d,d,d,,,,,,,,,,,,d
+,,,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,,,,,,,d,,,,d,,,,,,,,d,,,,d,d,d,,,,d,,,,,,,,d,,,,d
+,,,,,,,d,,,,d,,,,,,,,d,,,,d,d,d,,,,d,,,,,,,,d,,,,d
+,,d,d,d,d,d,d,d,,,d,,,d,d,d,d,d,d,d,,,d,d,d,,,d,d,d,d,d,d,d,,,d,,,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,d,d,d,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,,,d,d,d,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,,,d,,,d,d,d,d,d,d,d,,,d,d,d,,,d,d,d,d,d,d,d,,,d,,,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,,,,,,d,d,d,d,d,d,d,,,,,,,,d,d,d,d,d,d,d,,,,,,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,,,,,,d,d,d,d,d,d,d,,,,,,,,d,d,d,d,d,d,d,,,,,,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,,,,,,d,d,d,d,d,d,d,,,,,,,,d,d,d,d,d,d,d,,,,,,d,d,d,d,d,d,d
+,,d,d,d,d,d,d,d,,,,,,d,d,d,d,d,d,d,,,,,,,,d,d,d,d,d,d,d,,,,,,d,d,d,d,d,d,d
+
+
+#build label(guildhall2) start(25; 25; staircase center) message(Smooth tiles and furnish/declare locations as required.) build basic furniture
+
+
+,,`,`,`,`,`,`,`,,,,,,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,,,,,,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,,,,,,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,,,,,,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,,,,,,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,,,,,,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,,,,,,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,,,,,,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,,,t,,,`,`,`,`,`,`,`,,,t,s,t,,,`,`,`,`,`,`,`,,,t,,,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,d,`,`,,,`,`,`,`,`,`,`,d,`,`,`,`,`,d,`,`,`,`,`,`,`,,,`,`,d,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,,,`,,,`,`,`,`,`,`,`,,,`,`,`,,,`,`,`,`,`,`,`,,,`,,,`,`,`,`,`,`,`
+,,,,,,,d,,,,`,,,,,,,,d,,,,`,`,`,,,,d,,,,,,,,`,,,,d
+,,,,,,,`,,,,`,,,,,,,,`,,,,`,`,`,,,,`,,,,,,,,`,,,,`
+,,,,,,t,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,t
+,,,,,,,,,,,`,,,,,,,,,,,,`,`,`,,,,,,,,,,,,`
+,,,,,,,,,,,`,,,,,,,,,,,,`,`,`,,,,,,,,,,,,`
+,,`,`,`,`,`,`,`,,,`,,,`,`,`,`,`,`,`,,,`,`,`,,,`,`,`,`,`,`,`,,,`,,,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,,,`,,,`,`,`,`,`,`,`,,,`,`,`,,,`,`,`,`,`,`,`,,,`,,,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,,,`,,,`,`,`,`,`,`,`,,,`,`,`,,,`,`,`,`,`,`,`,,,`,,,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,,,`,,,`,`,`,`,`,`,`,,,`,`,`,,,`,`,`,`,`,`,`,,,`,,,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,,,`,,,`,`,`,`,`,`,`,,,`,`,`,,,`,`,`,`,`,`,`,,,`,,,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,d,`,`,,,`,`,`,`,`,`,`,d,`,`,`,`,`,d,`,`,`,`,`,`,`,,,`,`,d,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,,,`,,,`,`,`,`,`,`,`,,,`,s,`,,,`,`,`,`,`,`,`,,,`,,,`,`,`,`,`,`,`
+,,,,,,,d,,,,`,,,,,,,,d,,,,`,,`,,,,d,,,,,,,,`,,,,d
+,,,,,,,`,,,,`,,,,,,,,`,,,,`,`,`,,,,`,,,,,,,,`,,,,`
+,,,,,,t,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,t
+,,,,,,s,`,`,`,`,`,`,`,`,`,`,`,`,`,s,,`,,`,,`,,s,`,`,`,`,`,`,`,`,`,`,`,`,`,s
+,,,,,,t,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,,,,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,t
+,,,,,,,`,,,,`,,,,,,,,`,,,,`,`,`,,,,`,,,,,,,,`,,,,`
+,,,,,,,d,,,,`,,,,,,,,d,,,,`,,`,,,,d,,,,,,,,`,,,,d
+,,`,`,`,`,`,`,`,,,`,,,`,`,`,`,`,`,`,,,`,s,`,,,`,`,`,`,`,`,`,,,`,,,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,d,`,`,,,`,`,`,`,`,`,`,d,`,`,`,`,`,d,`,`,`,`,`,`,`,,,`,`,d,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,,,`,,,`,`,`,`,`,`,`,,,`,`,`,,,`,`,`,`,`,`,`,,,`,,,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,,,`,,,`,`,`,`,`,`,`,,,`,`,`,,,`,`,`,`,`,`,`,,,`,,,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,,,`,,,`,`,`,`,`,`,`,,,`,`,`,,,`,`,`,`,`,`,`,,,`,,,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,,,`,,,`,`,`,`,`,`,`,,,`,`,`,,,`,`,`,`,`,`,`,,,`,,,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,,,`,,,`,`,`,`,`,`,`,,,`,`,`,,,`,`,`,`,`,`,`,,,`,,,`,`,`,`,`,`,`
+,,,,,,,,,,,`,,,,,,,,,,,,`,`,`,,,,,,,,,,,,`
+,,,,,,,,,,,`,,,,,,,,,,,,`,`,`,,,,,,,,,,,,`
+,,,,,,t,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,t
+,,,,,,,`,,,,`,,,,,,,,`,,,,`,`,`,,,,`,,,,,,,,`,,,,`
+,,,,,,,d,,,,`,,,,,,,,d,,,,`,`,`,,,,d,,,,,,,,`,,,,d
+,,`,`,`,`,`,`,`,,,`,,,`,`,`,`,`,`,`,,,`,`,`,,,`,`,`,`,`,`,`,,,`,,,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,d,`,`,,,`,`,`,`,`,`,`,d,`,`,`,`,`,d,`,`,`,`,`,`,`,,,`,`,d,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,,,t,,,`,`,`,`,`,`,`,,,t,s,t,,,`,`,`,`,`,`,`,,,t,,,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,,,,,,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,,,,,,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,,,,,,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,,,,,,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,,,,,,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,,,,,,`,`,`,`,`,`,`
+,,`,`,`,`,`,`,`,,,,,,`,`,`,`,`,`,`,,,,,,,,`,`,`,`,`,`,`,,,,,,`,`,`,`,`,`,`
+
+
+#notes label(beds_help)
+Suites for nobles and apartments for the teeming masses
+""
+Features:
+- Well-appointed suites to satisfy most nobles
+- Apartments with beds and storage to keep dwarves happy
+- Meta blueprint included for designating 6 levels of apartments for a full 200+ dwarves
+""
+Suites Walkthrough:
+"1) Dig out the suites layer with /suites1 and queue up manufacturing by running ""quickfort orders"" on /suites2."
+""
+"2) Once the area is dug out, furnish the suites with /suites2. The rooms are left unconfigured so you can set them up as needed room types and assign them to specific nobles. Each room can serve as a bedroom, a dining hall, an office, or a tomb."
+""
+Apartments Walkthrough:
+"1) Dig out one layer of apartments with /apartments1, or 6 layers at once (enough for 200 dwarves) with /apartments1_stack. Run ""quickfort orders"" for /apartments2 once for every apartments layer that you are digging."
+""
+"2) Once a layer is dug out, furnish it with /apartments2."
+""
+"3) Once the beds are in place (the other furniture can still be unbuilt), configure the rooms with /apartments3. Once the urns are all in place, run ""burial -pets"" to set them all to accept burials."
+"#dig label(suites1) start(18; 18; staircase center) message(This would be a good time to queue manager orders for /suites2. Once the area is dug out, continue with /suites2) noble suites"
+
+,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,d,d,,,,d,,,,,,d,,,,d,,d,,,,d,,,,,,d,,,,d,d
+,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,d
+,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,d
+,d,d,d,d,d,d,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,d,d,d,d,d,d
+,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,d
+,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,d
+,d,d,,,,,,,,,,,,,,d,d,d,,,,,,,,,,,,,,d,d
+,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,d
+,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,d
+,d,d,d,d,d,d,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,d,d,d,d,d,d
+,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,d
+,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,,d,,d,d,d,d,d,,d,d,d,d,d,,d,d
+,d,d,,,,d,,,,,,d,,,,d,d,d,,,,d,,,,,,d,,,,d,d
+,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,i,i,i,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,d,d,,d,d,d,d,d,d,d,d,d,d,,d,i,i,i,d,,d,d,d,d,d,d,d,d,d,d,,d,d
+,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,i,i,i,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,d,d,,,,d,,,,,,d,,,,d,d,d,,,,d,,,,,,d,,,,d,d
+,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,,d,,d,d,d,d,d,,d,d,d,d,d,,d,d
+,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,d
+,d,d,d,d,d,d,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,d,d,d,d,d,d
+,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,d
+,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,d
+,d,d,,,,,,,,,,,,,,d,d,d,,,,,,,,,,,,,,d,d
+,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,d
+,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,d
+,d,d,d,d,d,d,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,d,d,d,d,d,d
+,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,d
+,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,d,d,,d,d,d,d,d,,d,d,d,d,d,,d,d
+,d,d,,,,d,,,,,,d,,,,d,,d,,,,d,,,,,,d,,,,d,d
+,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+
+#build label(suites2) start(18; 18; staircase center) message(bedrooms are left unconfigured so you can assign them to specific nobles)
+
+,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,`,`,,,,d,,,,,,d,,,,d,,d,,,,d,,,,,,d,,,,`,`
+,`,`,,a,r,`,`,h,,h,`,`,r,a,,`,s,`,,a,r,`,`,h,,h,`,`,r,a,,`,`
+,`,`,,`,`,`,`,h,,h,`,`,`,`,,`,`,`,,`,`,`,`,h,,h,`,`,`,`,,`,`
+,`,`,d,`,`,b,`,`,,`,`,b,`,`,d,`,`,`,d,`,`,b,`,`,,`,`,b,`,`,d,`,`
+,`,`,,c,`,`,`,f,,f,`,`,`,c,,`,s,`,,c,`,`,`,f,,f,`,`,`,c,,`,`
+,`,`,,t,`,s,`,n,,n,`,s,`,t,,`,`,`,,t,`,s,`,n,,n,`,s,`,t,,`,`
+,`,`,,,,,,,,,,,,,,`,`,`,,,,,,,,,,,,,,`,`
+,`,`,,t,`,s,`,n,,n,`,s,`,t,,`,s,`,,t,`,s,`,n,,n,`,s,`,t,,`,`
+,`,`,,c,`,`,`,f,,f,`,`,`,c,,`,`,`,,c,`,`,`,f,,f,`,`,`,c,,`,`
+,`,`,d,`,`,b,`,`,,`,`,b,`,`,d,`,`,`,d,`,`,b,`,`,,`,`,b,`,`,d,`,`
+,`,`,,`,`,`,`,h,,h,`,`,`,`,,`,s,`,,`,`,`,`,h,,h,`,`,`,`,,`,`
+,`,`,,a,r,`,`,h,,h,`,`,r,a,,d,,d,,a,r,`,`,h,,h,`,`,r,a,,`,`
+,`,`,,,,d,,,,,,d,,,,`,`,`,,,,d,,,,,,d,,,,`,`
+,`,`,d,`,`,`,`,`,`,`,`,`,`,d,`,`,`,`,`,d,`,`,`,`,`,`,`,`,`,`,d,`,`
+,`,`,,s,`,`,s,`,`,s,`,`,s,,`,`,`,`,`,,s,`,`,s,`,`,s,`,`,s,,`,`
+,`,`,d,`,`,`,`,`,`,`,`,`,`,d,`,`,`,`,`,d,`,`,`,`,`,`,`,`,`,`,d,`,`
+,`,`,,,,d,,,,,,d,,,,`,`,`,,,,d,,,,,,d,,,,`,`
+,`,`,,a,r,`,`,h,,h,`,`,r,a,,d,,d,,a,r,`,`,h,,h,`,`,r,a,,`,`
+,`,`,,`,`,`,`,h,,h,`,`,`,`,,`,s,`,,`,`,`,`,h,,h,`,`,`,`,,`,`
+,`,`,d,`,`,b,`,`,,`,`,b,`,`,d,`,`,`,d,`,`,b,`,`,,`,`,b,`,`,d,`,`
+,`,`,,c,`,`,`,f,,f,`,`,`,c,,`,`,`,,c,`,`,`,f,,f,`,`,`,c,,`,`
+,`,`,,t,`,s,`,n,,n,`,s,`,t,,`,s,`,,t,`,s,`,n,,n,`,s,`,t,,`,`
+,`,`,,,,,,,,,,,,,,`,`,`,,,,,,,,,,,,,,`,`
+,`,`,,t,`,s,`,n,,n,`,s,`,t,,`,`,`,,t,`,s,`,n,,n,`,s,`,t,,`,`
+,`,`,,c,`,`,`,f,,f,`,`,`,c,,`,s,`,,c,`,`,`,f,,f,`,`,`,c,,`,`
+,`,`,d,`,`,b,`,`,,`,`,b,`,`,d,`,`,`,d,`,`,b,`,`,,`,`,b,`,`,d,`,`
+,`,`,,`,`,`,`,h,,h,`,`,`,`,,`,`,`,,`,`,`,`,h,,h,`,`,`,`,,`,`
+,`,`,,a,r,`,`,h,,h,`,`,r,a,,`,s,`,,a,r,`,`,h,,h,`,`,r,a,,`,`
+,`,`,,,,d,,,,,,d,,,,d,,d,,,,d,,,,,,d,,,,`,`
+,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+
+#meta label(apartments1_stack) start(staircase center) digs 6 layers of apartments - enough for 200 dwarves
+/apartments1
+#>
+/apartments1
+#>
+/apartments1
+#>
+/apartments1
+#>
+/apartments1
+#>
+/apartments1
+
+"#dig label(apartments1) start(18; 18; staircase center) message(This would be a good time to enqueue manager orders for /apartments2. Once the area is dug out, continue with /apartments2.) apartment complex"
+
+,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,d,d,,,d,,,,d,,,,d,,,d,,d,,,d,,,,d,,,,d,,,d,d
+,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d
+,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d
+,d,d,,,d,,,,d,,,,d,,,d,d,d,,,d,,,,d,,,,d,,,d,d
+,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d
+,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d
+,d,d,,,d,,,,d,,,,d,,,d,d,d,,,d,,,,d,,,,d,,,d,d
+,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d
+,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,d,d,,d,d,d,,d,d,d,,d,d,d,,d,,d,,d,d,d,,d,d,d,,d,d,d,,d,d
+,d,d,,,d,,,,d,,,,d,,,d,d,d,,,d,,,,d,,,,d,,,d,d
+,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,i,i,i,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,d,d,,d,d,d,d,d,d,d,d,d,d,,d,i,i,i,d,,d,d,d,d,d,d,d,d,d,d,,d,d
+,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,i,i,i,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,d,d,,,d,,,,d,,,,d,,,d,d,d,,,d,,,,d,,,,d,,,d,d
+,d,d,,d,d,d,,d,d,d,,d,d,d,,d,,d,,d,d,d,,d,d,d,,d,d,d,,d,d
+,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d
+,d,d,,,d,,,,d,,,,d,,,d,d,d,,,d,,,,d,,,,d,,,d,d
+,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d
+,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d
+,d,d,,,d,,,,d,,,,d,,,d,d,d,,,d,,,,d,,,,d,,,d,d
+,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d
+,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d,d,,d,d
+,d,d,,,d,,,,d,,,,d,,,d,,d,,,d,,,,d,,,,d,,,d,d
+,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+
+"#build label(apartments2) start(18; 18; staircase center) message(Once beds have been placed, continue with /apartments3.)"
+
+,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,`,`,,,d,,,,d,,,,d,,,d,,d,,,d,,,,d,,,,d,,,`,`
+,`,`,,f,`,n,,f,`,n,,f,`,n,,`,s,`,,n,`,f,,n,`,f,,n,`,f,,`,`
+,`,`,d,`,b,`,d,`,b,`,d,`,b,`,d,`,`,`,d,`,b,`,d,`,b,`,d,`,b,`,d,`,`
+,`,`,,h,`,n,,h,`,n,,h,`,n,,`,`,`,,n,`,h,,n,`,h,,n,`,h,,`,`
+,`,`,,,d,,,,d,,,,d,,,`,s,`,,,d,,,,d,,,,d,,,`,`
+,`,`,,f,`,n,,f,`,n,,f,`,n,,`,`,`,,n,`,f,,n,`,f,,n,`,f,,`,`
+,`,`,d,`,b,`,d,`,b,`,d,`,b,`,d,`,`,`,d,`,b,`,d,`,b,`,d,`,b,`,d,`,`
+,`,`,,h,`,n,,h,`,n,,h,`,n,,`,s,`,,n,`,h,,n,`,h,,n,`,h,,`,`
+,`,`,,,d,,,,d,,,,d,,,`,`,`,,,d,,,,d,,,,d,,,`,`
+,`,`,,f,`,n,,f,`,n,,f,`,n,,`,`,`,,n,`,f,,n,`,f,,n,`,f,,`,`
+,`,`,d,`,b,`,d,`,b,`,d,`,b,`,d,`,s,`,d,`,b,`,d,`,b,`,d,`,b,`,d,`,`
+,`,`,,h,`,n,,h,`,n,,h,`,n,,d,,d,,n,`,h,,n,`,h,,n,`,h,,`,`
+,`,`,,,d,,,,d,,,,d,,,`,`,`,,,d,,,,d,,,,d,,,`,`
+,`,`,d,`,`,`,`,`,`,`,`,`,`,d,`,`,`,`,`,d,`,`,`,`,`,`,`,`,`,`,d,`,`
+,`,`,,s,`,`,s,`,`,s,`,`,s,,`,`,`,`,`,,s,`,`,s,`,`,s,`,`,s,,`,`
+,`,`,d,`,`,`,`,`,`,`,`,`,`,d,`,`,`,`,`,d,`,`,`,`,`,`,`,`,`,`,d,`,`
+,`,`,,,d,,,,d,,,,d,,,`,`,`,,,d,,,,d,,,,d,,,`,`
+,`,`,,h,`,n,,h,`,n,,h,`,n,,d,,d,,n,`,h,,n,`,h,,n,`,h,,`,`
+,`,`,d,`,b,`,d,`,b,`,d,`,b,`,d,`,s,`,d,`,b,`,d,`,b,`,d,`,b,`,d,`,`
+,`,`,,f,`,n,,f,`,n,,f,`,n,,`,`,`,,n,`,f,,n,`,f,,n,`,f,,`,`
+,`,`,,,d,,,,d,,,,d,,,`,`,`,,,d,,,,d,,,,d,,,`,`
+,`,`,,h,`,n,,h,`,n,,h,`,n,,`,s,`,,n,`,h,,n,`,h,,n,`,h,,`,`
+,`,`,d,`,b,`,d,`,b,`,d,`,b,`,d,`,`,`,d,`,b,`,d,`,b,`,d,`,b,`,d,`,`
+,`,`,,f,`,n,,f,`,n,,f,`,n,,`,`,`,,n,`,f,,n,`,f,,n,`,f,,`,`
+,`,`,,,d,,,,d,,,,d,,,`,s,`,,,d,,,,d,,,,d,,,`,`
+,`,`,,h,`,n,,h,`,n,,h,`,n,,`,`,`,,n,`,h,,n,`,h,,n,`,h,,`,`
+,`,`,d,`,b,`,d,`,b,`,d,`,b,`,d,`,`,`,d,`,b,`,d,`,b,`,d,`,b,`,d,`,`
+,`,`,,f,`,n,,f,`,n,,f,`,n,,`,s,`,,n,`,f,,n,`,f,,n,`,f,,`,`
+,`,`,,,d,,,,d,,,,d,,,d,,d,,,d,,,,d,,,,d,,,`,`
+,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+
+#query label(apartments3) start(18; 18; staircase center) message(Coffins should be configured with DFHack burial script)
+
+,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,`,`,,,`,,,,`,,,,`,,,`,,`,,,`,,,,`,,,,`,,,`,`
+,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`
+,`,`,`,`,r&,`,`,`,r&,`,`,`,r&,`,`,`,`,`,`,`,r&,`,`,`,r&,`,`,`,r&,`,`,`,`
+,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`
+,`,`,,,`,,,,`,,,,`,,,`,`,`,,,`,,,,`,,,,`,,,`,`
+,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`
+,`,`,`,`,r&,`,`,`,r&,`,`,`,r&,`,`,`,`,`,`,`,r&,`,`,`,r&,`,`,`,r&,`,`,`,`
+,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`
+,`,`,,,`,,,,`,,,,`,,,`,`,`,,,`,,,,`,,,,`,,,`,`
+,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`
+,`,`,`,`,r&,`,`,`,r&,`,`,`,r&,`,`,`,`,`,`,`,r&,`,`,`,r&,`,`,`,r&,`,`,`,`
+,`,`,,`,`,`,,`,`,`,,`,`,`,,`,,`,,`,`,`,,`,`,`,,`,`,`,,`,`
+,`,`,,,`,,,,`,,,,`,,,`,`,`,,,`,,,,`,,,,`,,,`,`
+,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,`,`,,`,`,`,`,`,`,`,`,`,`,,`,`,`,`,`,,`,`,`,`,`,`,`,`,`,`,,`,`
+,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,`,`,,,`,,,,`,,,,`,,,`,`,`,,,`,,,,`,,,,`,,,`,`
+,`,`,,`,`,`,,`,`,`,,`,`,`,,`,,`,,`,`,`,,`,`,`,,`,`,`,,`,`
+,`,`,`,`,r&,`,`,`,r&,`,`,`,r&,`,`,`,`,`,`,`,r&,`,`,`,r&,`,`,`,r&,`,`,`,`
+,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`
+,`,`,,,`,,,,`,,,,`,,,`,`,`,,,`,,,,`,,,,`,,,`,`
+,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`
+,`,`,`,`,r&,`,`,`,r&,`,`,`,r&,`,`,`,`,`,`,`,r&,`,`,`,r&,`,`,`,r&,`,`,`,`
+,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`
+,`,`,,,`,,,,`,,,,`,,,`,`,`,,,`,,,,`,,,,`,,,`,`
+,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`
+,`,`,`,`,r&,`,`,`,r&,`,`,`,r&,`,`,`,`,`,`,`,r&,`,`,`,r&,`,`,`,r&,`,`,`,`
+,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`,`,,`,`
+,`,`,,,`,,,,`,,,,`,,,`,,`,,,`,,,,`,,,,`,,,`,`
+,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`
+
diff --git a/data/blueprints/library/embark.csv b/data/blueprints/library/embark.csv
new file mode 100644
index 000000000..a92c32839
--- /dev/null
+++ b/data/blueprints/library/embark.csv
@@ -0,0 +1,17 @@
+#build label(workshops) start(8;2;center of wagon) basic post embark workshops
+`,` ,`,`,` ,`,~,~,~,`,` ,`,`,` ,`,#
+`,wc,`,`,wt,`,~,~,~,`,wm,`,`,wr,`,#
+`,` ,`,`,` ,`,~,~,~,`,` ,`,`,` ,`,#
+#,# ,#,#,# ,#,#,#,#,#,# ,#,#,# ,#,#
+#place label(stockpiles) basic post embark stockpiles
+w(5x10), , , , ,s(5x1) , , , , ,p(5x1), , , , ,#
+ , , , , ,g(5x4) , , , , ,d(5x1), , , , ,#
+ , , , , , , , , , ,f(5x3), , , , ,#
+ , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , ,#
+ , , , , ,u(10x5), , , , , , , , , ,#
+ , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , ,#
+# ,#,#,#,#,# ,#,#,#,#,# ,#,#,#,#,#
diff --git a/data/blueprints/library/exploratory-mining/connected-mineshafts.csv b/data/blueprints/library/exploratory-mining/connected-mineshafts.csv
new file mode 100644
index 000000000..3b4d71de2
--- /dev/null
+++ b/data/blueprints/library/exploratory-mining/connected-mineshafts.csv
@@ -0,0 +1,43 @@
+#dig diagonal interconnecting tunnels with stairs at intersections
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d,#
+ ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,#
+ , ,d, , , , , ,d, , , ,d, , , , , ,d, , , ,d, , , , , ,d, , , ,d, , , , , ,d, , ,#
+ , , ,d, , , ,d, , , , , ,d, , , ,d, , , , , ,d, , , ,d, , , , , ,d, , , ,d, , , ,#
+ , , , ,d, ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,d, , , , ,#
+ , , , , ,i, , , , , , , , , ,i, , , , , , , , , ,i, , , , , , , , , ,i, , , , , ,#
+ , , , ,d, ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,d, , , , ,#
+ , , ,d, , , ,d, , , , , ,d, , , ,d, , , , , ,d, , , ,d, , , , , ,d, , , ,d, , , ,#
+ , ,d, , , , , ,d, , , ,d, , , , , ,d, , , ,d, , , , , ,d, , , ,d, , , , , ,d, , ,#
+ ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,#
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d,#
+ ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,#
+ , ,d, , , , , ,d, , , ,d, , , , , ,d, , , ,d, , , , , ,d, , , ,d, , , , , ,d, , ,#
+ , , ,d, , , ,d, , , , , ,d, , , ,d, , , , , ,d, , , ,d, , , , , ,d, , , ,d, , , ,#
+ , , , ,d, ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,d, , , , ,#
+ , , , , ,i, , , , , , , , , ,i, , , , , , , , , ,i, , , , , , , , , ,i, , , , , ,#
+ , , , ,d, ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,d, , , , ,#
+ , , ,d, , , ,d, , , , , ,d, , , ,d, , , , , ,d, , , ,d, , , , , ,d, , , ,d, , , ,#
+ , ,d, , , , , ,d, , , ,d, , , , , ,d, , , ,d, , , , , ,d, , , ,d, , , , , ,d, , ,#
+ ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,#
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d,#
+ ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,#
+ , ,d, , , , , ,d, , , ,d, , , , , ,d, , , ,d, , , , , ,d, , , ,d, , , , , ,d, , ,#
+ , , ,d, , , ,d, , , , , ,d, , , ,d, , , , , ,d, , , ,d, , , , , ,d, , , ,d, , , ,#
+ , , , ,d, ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,d, , , , ,#
+ , , , , ,i, , , , , , , , , ,i, , , , , , , , , ,i, , , , , , , , , ,i, , , , , ,#
+ , , , ,d, ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,d, , , , ,#
+ , , ,d, , , ,d, , , , , ,d, , , ,d, , , , , ,d, , , ,d, , , , , ,d, , , ,d, , , ,#
+ , ,d, , , , , ,d, , , ,d, , , , , ,d, , , ,d, , , , , ,d, , , ,d, , , , , ,d, , ,#
+ ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,#
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d,#
+ ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,#
+ , ,d, , , , , ,d, , , ,d, , , , , ,d, , , ,d, , , , , ,d, , , ,d, , , , , ,d, , ,#
+ , , ,d, , , ,d, , , , , ,d, , , ,d, , , , , ,d, , , ,d, , , , , ,d, , , ,d, , , ,#
+ , , , ,d, ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,d, , , , ,#
+ , , , , ,i, , , , , , , , , ,i, , , , , , , , , ,i, , , , , , , , , ,i, , , , , ,#
+ , , , ,d, ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,d, , , , ,#
+ , , ,d, , , ,d, , , , , ,d, , , ,d, , , , , ,d, , , ,d, , , , , ,d, , , ,d, , , ,#
+ , ,d, , , , , ,d, , , ,d, , , , , ,d, , , ,d, , , , , ,d, , , ,d, , , , , ,d, , ,#
+ ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,d, , , , , , , ,d, ,#
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
diff --git a/data/blueprints/library/exploratory-mining/tunnels.csv b/data/blueprints/library/exploratory-mining/tunnels.csv
new file mode 100644
index 000000000..4af994ede
--- /dev/null
+++ b/data/blueprints/library/exploratory-mining/tunnels.csv
@@ -0,0 +1,52 @@
+#dig paths every 10 units
+d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d, , , , , , , , , ,d
+d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d
diff --git a/data/blueprints/library/exploratory-mining/vertical-mineshafts.csv b/data/blueprints/library/exploratory-mining/vertical-mineshafts.csv
new file mode 100644
index 000000000..28b4de563
--- /dev/null
+++ b/data/blueprints/library/exploratory-mining/vertical-mineshafts.csv
@@ -0,0 +1,42 @@
+#dig mineshafts as stairs every 3rd tile
+i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+ , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,#
+i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,i, , ,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
diff --git a/data/blueprints/library/layout-helpers/mark_down_left.csv b/data/blueprints/library/layout-helpers/mark_down_left.csv
new file mode 100644
index 000000000..84732ccf6
--- /dev/null
+++ b/data/blueprints/library/layout-helpers/mark_down_left.csv
@@ -0,0 +1,201 @@
+#dig start(200;1) marks a diagonal line down and left starting at the cursor
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,md
+,,,,,,,,,,,,md
+,,,,,,,,,,,md
+,,,,,,,,,,md
+,,,,,,,,,md
+,,,,,,,,md
+,,,,,,,md
+,,,,,,md
+,,,,,md
+,,,,md
+,,,md
+,,md
+,md
+md
diff --git a/data/blueprints/library/layout-helpers/mark_down_right.csv b/data/blueprints/library/layout-helpers/mark_down_right.csv
new file mode 100644
index 000000000..07f6ae1d0
--- /dev/null
+++ b/data/blueprints/library/layout-helpers/mark_down_right.csv
@@ -0,0 +1,201 @@
+#dig start(1;1) marks a diagonal line down and right starting at the cursor
+md
+,md
+,,md
+,,,md
+,,,,md
+,,,,,md
+,,,,,,md
+,,,,,,,md
+,,,,,,,,md
+,,,,,,,,,md
+,,,,,,,,,,md
+,,,,,,,,,,,md
+,,,,,,,,,,,,md
+,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
diff --git a/data/blueprints/library/layout-helpers/mark_up_left.csv b/data/blueprints/library/layout-helpers/mark_up_left.csv
new file mode 100644
index 000000000..a029136cd
--- /dev/null
+++ b/data/blueprints/library/layout-helpers/mark_up_left.csv
@@ -0,0 +1,201 @@
+#dig start(200;200) marks a diagonal line up and left starting at the cursor
+md
+,md
+,,md
+,,,md
+,,,,md
+,,,,,md
+,,,,,,md
+,,,,,,,md
+,,,,,,,,md
+,,,,,,,,,md
+,,,,,,,,,,md
+,,,,,,,,,,,md
+,,,,,,,,,,,,md
+,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
diff --git a/data/blueprints/library/layout-helpers/mark_up_right.csv b/data/blueprints/library/layout-helpers/mark_up_right.csv
new file mode 100644
index 000000000..8f2697d62
--- /dev/null
+++ b/data/blueprints/library/layout-helpers/mark_up_right.csv
@@ -0,0 +1,201 @@
+#dig start(1;200) marks a diagonal line up and right starting at the cursor
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,,md
+,,,,,,,,,,,,,md
+,,,,,,,,,,,,md
+,,,,,,,,,,,md
+,,,,,,,,,,md
+,,,,,,,,,md
+,,,,,,,,md
+,,,,,,,md
+,,,,,,md
+,,,,,md
+,,,,md
+,,,md
+,,md
+,md
+md
diff --git a/data/blueprints/library/quickfortress.csv b/data/blueprints/library/quickfortress.csv
new file mode 100644
index 000000000..9d11ec675
--- /dev/null
+++ b/data/blueprints/library/quickfortress.csv
@@ -0,0 +1,768 @@
+#notes label(help)
+"This is Buketgeshud, or translated from Dwarvish, The Quick Fortress. It is a set of basic blueprints for quickfort, demonstrating its use in assembling an entire basic (if incomplete) fort."
+""
+Buketgeshud is designed around a 30x20 footprint with a common 2x2 central staircase. Blueprints can be repeated in any direction to connect in a modular fashion with adjacent 30x20 areas. A fortresswide example recirculating waterfall/plumbing system is included as an overlay if you're feeling hardcore.
+""
+Walkthrough:
+1) Embark!
+""
+2) Clear a 30 wide x 20 high region of trees on the surface. This should be uninterrupted flat ground with soil (so that we can place farms below). Deconstruct your wagon.
+""
+"3) Run /surface1. You'll want to put the cursor in the middle of the 30x20 cleared area (14 right, 8 down from the top left corner). This digs out stairs on the surface, a farm/depot/workshop level below, as well as the beginnings of an entrance moat. The beginnings of a 3rd z-level are also dug out; don't build anything here if you'd like to put waterfall plumbing in later."
+""
+"4) After /surface1 is dug out, run /surface2 (beginning from the same starting position as you used for /surface1). This puts down a basic set of workshops commonly needed soon after embark, a couple farm plots, and a depot. It also places and configures starting stockpiles."
+""
+"5) If your embark site is near any enemies, run /surface3 to build walls and traps on the surface to protect against invaders."
+""
+"6) Dig out the central shaft and tunnels for several z-levels below our surface/depot level. Place the cursor THREE Z-levels below the surface, where no digging has occurred yet, and run /basic1 for 6 z-levels down starting from that level."
+""
+"7) Optionally run /basic2 to designate booze-only stockpiles around the central stairs on every z-level below the farming level. The stockpiles are configured to take booze from the level above, so be sure to apply /basic2 on the top level first and work your way down."
+""
+"8) Run workshops, bedrooms, and storeroom blueprints on any desired Z-level along our central shaft."
+""
+"9) If desired, add a fortresswide waterfall system, bathing your dwarves in tile after tile of lovely waterfall mist as they go about their day. Run /waterfall1 on the z-level immediately below your farm/depot level (you left that space empty, didn't you?) and run /plumbing1 on z-levels below that, down to the bottom of your fort. Each application of /plumbing1 will dig out two floors. On the bottommost level, the screw pumps that will be placed there require 2 floor tiles to sit on, so remove or refloor the 2 northern channel designations in the lower right corner on that z-level. You'll also need a reservior in the z-level below that (not included)."
+""
+"10) After all levels are dug out, apply /plumbing2 on the *bottommost* level, just above the reservior. The blueprint will build screw pumps on that level and the level above. Repeat on every alternate level up to the level below where you applied /waterfall1."
+""
+"11) Finally, apply /waterfall2 on the z-level where you applied /waterfall1. Route flowing water to the 2 tiles in lower right."
+"#dig label(surface1) start(15;10; top left corner of central stairs) message(The 3rd z-level just digs stairs; if you want to install the waterfall plumbing system later, leave this 3rd level EMPTY for now and start the base proper below that; use /basic1 to dig out areas for future use below.) Surface and farm/depot levels"
+`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,h,,,,,~,~,#
+`,,,,,,,,,,,,,,,,,,,,,,`,h,,h,h,,~,~,#
+`,,,,,,,,,,,,,,,,,,,,,,`,h,,,h,,~,~,#
+`,,,,,,,,,,,,,,,,,,,,,,`,h,h,,h,`,`,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,h,,,h,h,h,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,h,,h,h,,,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,h,,,,h,,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,h,h,h,h,h,,`,#
+`,,,,j,,,,,,,,,,j,j,,,,,,,`,h,,,,,,`,#
+`,,,,j,,,,,,,,,,j,j,,,,,,,`,h,,h,h,h,h,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,h,,,,,,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,h,h,h,h,h,,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,h,,,,,,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,h,,h,h,h,h,`,#
+`,,,,,,,,,,,,`,~,~,~,~,`,,,,,`,h,,,,,,`,#
+`,,,,,,,,,,,,`,~,~,~,~,`,,,,,`,`,h,h,h,h,,`,#
+`,,,,,,,,,,,,`,,,,,`,,,,,~,~,,,,,,`,#
+`,,,,,,,,,,,,`,,,,,`,,,,,`,`,h,h,h,h,h,`,#
+`,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`,`,#
+#>,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+d,d,d,d,j,d,d,d,d,d,d,d,d,d,j,j,d,d,d,d,d,d,`,`,`,`,`,`,`,`,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,`,,,,,,,`,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,`,,,,,,,`,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,`,,,,,,,`,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,`,,,,,,,`,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,`,,,,,,,`,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,`,,,,,,,`,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,,,,,d,d,d,d,d,`,,,,,,,`,#
+`,,,,d,,,,,,,,d,,d,d,,d,,,,,`,,,,,,,`,#
+d,d,d,d,i,d,d,d,d,d,d,d,d,d,i,i,d,d,d,d,d,d,`,,,,,,,`,#
+d,d,d,d,i,d,d,d,d,d,d,d,d,d,i,i,d,d,d,d,d,d,`,,,,,,,`,#
+`,,,,d,,,,d,d,d,d,,d,d,d,d,,d,d,d,d,`,,,,,,,`,#
+d,d,d,d,d,d,d,,d,d,d,d,,d,d,d,d,,d,d,d,d,`,,,,,,,`,#
+d,d,d,d,d,d,d,,,,d,d,,,d,d,,,,,,,`,,,,,,,`,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,`,,,,,,,`,#
+d,d,d,d,d,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,`,,,,,,,`,#
+d,d,d,d,d,d,d,,d,d,d,d,,d,d,d,d,d,d,d,d,d,`,,,,,,,`,#
+d,d,d,d,d,d,d,,d,d,d,d,,r,r,r,r,d,d,d,d,d,`,,,,,,,`,#
+d,d,d,d,d,d,d,d,d,d,d,d,,~,~,~,~,d,d,d,d,d,`,,,,,,,`,#
+`,`,`,`,j,`,`,`,`,`,`,`,`,~,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`,`,#
+#>,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+d,,,,i,,,,,,,,,,i,i,,,,,,,,,,j,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,d,d,,,,,,,,,,,,,,,#
+,,,,i,,,,,,,,,d,i,i,d,,,,,,,,,j,,,,,#
+,,,,i,,,,,,,,,d,i,i,d,,,,,,,,,j,,,,,#
+,,,,,,,,,,,,,,d,d,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,i,,,,,,,,,,j,j,,,,,,,,,,j,,,,,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+#meta label(surface2) Build basic workshops and stockpiles
+/surface2_build
+/surface2_place
+/surface2_query
+/surface2_doors
+"#build label(surface2_build) hidden() start(15;10; top left corner of central stairs) Populates the surface and farm/depot levels with farm plots, workshops and a depot"
+`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,~,#
+`,,,,,,,,wu,,,wr,,,,,,,,,,,`,,,,,,,~,#
+`,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,~,#
+`,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+`,,,,,,,,wn,,,,,,,,,,,,,,`,,,,,,,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+`,,,,,,,,,,,,`,~,~,~,~,`,,,,,`,,,,,,,`,#
+`,,,,,,,,,,,,`,~,~,~,~,`,,,,,`,,,,,,,`,#
+`,,,,,,,,,,,,`,,,,,`,,,,,~,,,,,,,`,#
+`,,,,,,,,,,,,`,,,,,`,,,,,`,,,,,,,`,#
+`,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`,`,#
+#>,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+,,,,`,,,,p(6x7),,,,,,`,`,p(6x7),,,,,,`,`,`,`,`,`,`,`,#
+,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,wl,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+`,`,`,`,,`,`,`,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,`,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,`,`,`,,,`,`,,,`,`,`,`,`,`,`,,,,,,,`,#
+,wc,,,,wm,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,`,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,`,,,,,`,,,,,,,D,,,`,,,,,,,`,#
+,wt,,,,wr,,`,,,,,`,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,`,,,,,,,,,,`,,,,,,,`,#
+,,,,`,,,`,,,,,`,`,`,`,`,,,,,,`,`,`,`,`,`,`,`,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+#place label(surface2_place) hidden() start(15;10; top left corner of central stairs) Lay stockpiles on surface and depot/farm levels
+`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
+`,r(6x6),,,,,~,,,,,,,r(3x6),,,r(5x6),,,,,z(1x6),`,`,,,,,~,~,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,,`,`,,~,~,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,,,`,,~,~,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,`,,`,`,`,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,,,`,`,`,`,#
+`,~,,,,,~,,,,,,,~,,,~,,,,,~,`,`,,`,`,,,`,#
+`,,,,,,,,,,,,,,,,,,w(4x8),,,,`,`,,,,`,,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,,,,,,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,,`,`,`,`,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,,,,,,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,,,,,,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,,`,`,`,`,`,#
+`,u(11x3),,,,,,,,,,,`,~,~,~,~,`,,,,,`,`,,,,,,`,#
+`,,,,,,,,,,,,`,~,~,~,~,`,,,,,`,`,`,`,`,`,,`,#
+`,,,,,,,,,,,,`,,,,,`,y(4x2),,,,~,~,,,,,,`,#
+`,,,,,,,,,,,,`,~,~,~,~,`,,,,,`,`,`,`,`,`,`,`,#
+`,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`,`,#
+#>,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+f,f,f,f,,f,f,f,,,,,,,`,`,,,,,,,`,`,`,`,`,`,`,`,#
+f,f,f,f,f,f,f,f,,,,,,,f(2x6),,,,,,,,`,,,,,,,`,#
+f,f,f,f,f,f,f,f,,,,,,,,,,,,,,,`,,,,,,,`,#
+f,f,,,,f,f,f,,,,,,,,,,,,,,,`,,,,,,,`,#
+f,f,,,,f,f,f,,,,,,,,,,,,,,,`,,,,,,,`,#
+f,f,,,,f,f,f,,,,,,,,,,,,,,,`,,,,,,,`,#
+f,f,f,f,f,f,f,f,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,`,,,,,,`,`,`,`,,,,,,`,,,,,,,`,#
+,,,,`,,,,,,,,`,,f(2x1),,,`,,,,,`,,,,,,,`,#
+w(4x2),,,,,f(9x2),,,,,,,,,`,`,f(1x2),,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,,`,`,,,,,,,`,,,,,,,`,#
+,,,,`,,,,g(4x2),,,,,,f(2x1),,,,,,,,`,,,,,,,`,#
+,,,s(1x8),,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,,`,`,,,,,,,`,,,,,,,`,#
+,,,,,,,,g(4x5),,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,`,,,,,,,,,`,`,`,`,,,,,,`,`,`,`,`,`,`,`,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+#query label(surface2_query) hidden() start(15;10; top left corner of central stairs) message(remember to set the farm plots to grow plump helmets) Adjust surface/depot level stockpiles
+`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
+`,bodyparts,,,,,~,,,,,,,rawhides,,,craftrefuse,,,,,,`,`,,,,,~,~,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,,`,`,,~,~,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,,,`,,~,~,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,`,,`,`,`,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,,,`,`,`,`,#
+`,~,,,,,~,,,,,,,~,,,~,,,,,~,`,`,,`,`,,,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,,,,`,,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,,,,,,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,,`,`,`,`,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,,,,,,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,,,,,,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,,`,`,`,`,`,#
+`,,,,,,,,,,,,`,~,~,~,~,`,,,,,`,`,,,,,,`,#
+`,,,,,,,,,,,,`,~,~,~,~,`,,,,,`,`,`,`,`,`,,`,#
+`,,,,,,,,,,,,`,,,,,`,,,,,~,~,,,,,,`,#
+`,,,,,,,,,,,,`,,,,,`,,,,,`,`,`,`,`,`,`,`,#
+`,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`,`,#
+#>,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+noseeds,,,,,,,,,,,,,,`,`,,,,,,,`,`,`,`,`,`,`,`,#
+,,,,,,,,,,,,,,seeds,,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,`,,,,,,`,`,`,`,,,,,,`,,,,,,,`,#
+,,,,`,,,,,,,,`,,booze,t{Down}{Left 2}&,,`,,,,,`,,,,,,,`,#
+,,,,,booze,,,,,,,,,`,`,booze,,,,,,`,,,,,,,`,#
+,,,,,t{Up 5}&,,,,,,,,,`,`,t{Left 3}&,,,,,,`,,,,,,,`,#
+,,,,`,,,,,,,,,,booze,t{Up}{Left 2}&,,,,,,,`,,,,,,,`,#
+,,,otherstone,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,,`,`,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,~,~,~,~,,,,,,`,,,,,,,`,#
+,,,,`,,,,,,,,,`,`,`,`,,,,,,`,`,`,`,`,`,`,`,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+#build label(surface2_doors) hidden() start(15;10; top left corner of central stairs) Just builds doors on the depot level (just below the surface)
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+#>,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+,,,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,`,`,#
+,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+`,,,,d,,,,,,,,d,,,,,d,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,,`,`,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,,`,`,,,,,,,`,,,,,,,`,#
+`,,,,d,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,d,d,,,d,d,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,d,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,d,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,,,,,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,`,`,`,`,,,,,,`,,,,,,,`,#
+,,,,,,,,,,,,,~,~,~,~,,,,,,`,,,,,,,`,#
+`,`,`,`,~,`,`,`,`,`,`,`,`,~,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`,`,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+#meta label(surface3) Build walls and traps to protect against invaders
+/surface3_walls
+/surface3_traps
+#build label(surface3_walls) hidden() start(15;10; top left corner of central stairs) Builds walls and bridges on the surface level. Note that the entrance on the southern wall juts out from the 30x20 footprint by 3 tiles; the southern bridge extends beyond the edge of the blueprint itself.\n\nYou'll need to add and connect levers yourself.
+Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,#
+Cw,,,,,,,,,,,,,,,,,,,,,,Cw,,,,,,gd(2x3),,#
+Cw,,,,,,,,,,,,,,,,,,,,,,Cw,,,,,,,,#
+Cw,,,,,,,,,,,,,,,,,,,,,,Cw,,,,,,,,#
+Cw,,,,,,,,,,,,,,,,,,,,,,Cw,,,,,Cw,Cw,Cw,#
+Cw,,,,,,,,,,,,,,,,,,,,,,Cw,,,,,,,Cw,#
+Cw,,,,,,,,,,,,,,,,,,,,,,Cw,,,,,,,Cw,#
+Cw,,,,,,,,,,,,,,,,,,,,,,Cw,,,,,,,Cw,#
+Cw,,,,,,,,,,,,,,,,,,,,,,Cw,,,,,,,Cw,#
+Cw,,,,,,,,,,,,,,,,,,,,,,Cw,,,,,,,Cw,#
+Cw,,,,,,,,,,,,,,,,,,,,,,Cw,,,,,,,Cw,#
+Cw,,,,,,,,,,,,,,,,,,,,,,Cw,,,,,,,Cw,#
+Cw,,,,,,,,,,,,,,,,,,,,,,Cw,,,,,,,Cw,#
+Cw,,,,,,,,,,,,,,,,,,,,,,Cw,,,,,,,Cw,#
+Cw,,,,,,,,,,,,,,,,,,,,,,Cw,,,,,,,Cw,#
+Cw,,,,,,,,,,,,Cw,gw(4x2),,,,Cw,,,,,Cw,,,,,,,Cw,#
+Cw,,,,,,,,,,,,Cw,,,,,Cw,,,,,Cw,Cw,,,,,,Cw,#
+Cw,,,,,,,,,,,,Cw,,,,,Cw,,,,,ga(2x1),,,,,,,Cw,#
+Cw,,,,,,,,,,,,Cw,,,,,Cw,,,,,Cw,Cw,,,,,,Cw,#
+Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,,,,,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,Cw,#
+,,,,,,,,,,,,Cw,,,,,Cw,,,,,,,,,,,,,#
+,,,,,,,,,,,,Cw,gw(4x2),,,,Cw,,,,,,,,,,,,,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+#build label(surface3_traps) hidden() start(15;10; top left corner of central stairs) Put some stone-fall traps down.
+`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,Ts,Ts,Ts,,~,~,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,Ts,`,`,,~,~,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,Ts,Ts,`,,~,~,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,`,Ts,`,`,`,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,Ts,Ts,`,`,`,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,Ts,`,`,Ts,Ts,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,Ts,Ts,Ts,`,Ts,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,Ts,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,Ts,Ts,Ts,Ts,Ts,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,Ts,`,`,`,`,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,Ts,Ts,Ts,Ts,Ts,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,`,`,`,`,Ts,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,Ts,Ts,Ts,Ts,Ts,`,#
+`,,,,,,,,,,,,,,,,,,,,,,`,`,Ts,`,`,`,`,`,#
+`,,,,,,,,,,,,`,~,~,~,~,`,,,,,`,`,Ts,Ts,Ts,Ts,Ts,`,#
+`,,,,,,,,,,,,`,~,~,~,~,`,,,,,`,`,`,`,`,`,Ts,`,#
+`,,,,,,,,,,,,`,,,,,`,,,,,~,~,Ts,Ts,Ts,Ts,Ts,`,#
+`,,,,,,,,,,,,`,,,,,`,,,,,`,`,`,`,`,`,`,`,#
+`,`,`,`,`,`,`,`,`,`,`,`,`,~,~,~,~,`,`,`,`,`,`,`,`,`,`,`,`,`,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+#dig label(basic1) start(15;10; top left corner of central stairs) Common stair/shaft digging for all floors below surface/depot levels
+,,,,i,,,,,,,,,,i,i,,,,,,,,,,i,,,,,#
+,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
+,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
+,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
+,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
+,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
+,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
+,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
+,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
+d,d,d,d,i,d,d,d,d,d,d,d,d,d,i,i,d,d,d,d,d,d,d,d,d,i,d,d,d,d,#
+d,d,d,d,i,d,d,d,d,d,d,d,d,d,i,i,d,d,d,d,d,d,d,d,d,i,d,d,d,d,#
+,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
+,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
+,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
+,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
+,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
+,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
+,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
+,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
+,,,,i,,,,,,,,,,i,i,,,,,,,,,,i,,,,,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+#meta label(basic2) Place and configure food/booze stockpiles around the central staircase
+/basic2_place
+/basic2_query
+#place label(basic2_place) hidden() start(15;10; top left corner of central stairs) Places food stockpiles around the central staircase
+,,,,`,,,,,,,,,,`,`,,,,,,,,,,`,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,f(2x1),,,,,,,,,,,,,,,,#
+,,,,`,,,,,,,,,f(1x2),`,`,f(1x2),,,,,,,,,`,,,,,#
+,,,,`,,,,,,,,,,`,`,,,,,,,,,,`,,,,,#
+,,,,,,,,,,,,,,f(2x1),,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,`,,,,,,,,,,`,`,,,,,,,,,,`,,,,,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+"#query label(basic2_query) hidden() start(15;10; top left corner of central stairs) configures booze stockpiles around stairway, taking from the stockpile on the level above"
+,,,,`,,,,,,,,,,`,`,,,,,,,,,,`,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,booze,t<&,,,,,,,,,,,,,,,#
+,,,,`,,,,,,,,,booze,`,`,booze,,,,,,,,,`,,,,,#
+,,,,`,,,,,,,,,t<&,`,`,t<&,,,,,,,,,`,,,,,#
+,,,,,,,,,,,,,,booze,t<&,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,`,,,,,,,,,,`,`,,,,,,,,,,`,,,,,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+"#dig label(workshops1) start(15;10; top left corner of central stairs) Just four big rooms, suitable for workshops"
+d,d,d,d,i,d,d,d,d,d,d,d,d,,i,i,,d,d,d,d,d,d,d,d,i,d,d,d,,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,,#
+,d,,,d,,,,,,,,d,,d,d,,d,,,,,,,,d,,,,,#
+d,d,d,d,i,d,d,d,d,d,d,d,d,d,i,i,d,d,d,d,d,d,d,d,d,i,d,d,d,d,#
+d,d,d,d,i,d,d,d,d,d,d,d,d,d,i,i,d,d,d,d,d,d,d,d,d,i,d,d,d,d,#
+,d,,,d,,,,,,,,d,,d,d,,d,,,,,,,,d,,,,,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,`,`,`,`,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,`,,,,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,`,,,,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,`,,,,#
+,,,,i,,,,,,,,,,i,i,,,,,,,,,,i,`,,,,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+#meta label(workshops2) Build commonly needed workshops and associated stockpiles
+/workshops2_build
+/workshops2_place
+/workshops2_doors
+#build label(workshops2_build) hidden() start(15;10; top left corner of central stairs) Sufficient workshops for basic non-food needs
+,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
+,,,wj,,,,we,,,,we,,,`,`,,,es,,,,ew,,,,ek,,,,#
+,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
+,,,wj,,,,we,,,,we,,,`,`,,,es,,,,eg,,,,wf,,,,#
+,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
+`,`,`,`,~,`,`,`,`,`,`,`,`,`,~,~,`,`,`,`,`,`,`,`,`,~,`,`,`,`,#
+`,`,`,`,~,`,`,`,`,`,`,`,`,`,~,~,`,`,`,`,`,`,`,`,`,~,`,`,`,`,#
+,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
+,,,wr,,,,wr,,,,wm,,,`,`,,,wc,,,,wc,,,,wb,,,,#
+,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
+`,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
+`,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
+`,,,wt,,,,wt,,,,wm,,,`,`,,,wc,,,,wc,,,,,,,,#
+`,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
+`,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+#place label(workshops2_place) hidden() start(15;10; top left corner of central stairs) Workshop source material piles placed around the workshops.
+e,e,e,e,,l,l,l,l,l,l,l,l,,`,`,,b,b,b,b,b,b,b,b,,b,b,b,,#
+e,e,e,e,e,l,l,l,l,l,l,l,l,,`,`,,b,b,b,b,b,b,b,b,b,b,b,b,,#
+e,e,,,,l,,,,l,,,,,`,`,,,,,b,,,,b,,,,b,,#
+e,e,,,,l,,,,l,,,,,`,`,,,,,b,,,,b,,,,b,,#
+e,e,,,,l,,,,l,,,,,`,`,,,,,b,,,,b,,,,b,,#
+,,,,,l,,,,l,,,,,`,`,,,,,b,,,,b,,,,b,,#
+,,,,,l,,,,l,,,,,`,`,,,,,b,,,,b,,,,b,,#
+,,,,,l,,,,l,,,,,`,`,,,,,b,,,,b,,,,b,,#
+,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
+`,`,`,`,~,`,`,`,`,`,`,`,`,`,~,~,`,`,`,`,`,`,`,`,`,~,`,`,`,`,#
+`,`,`,`,~,`,`,`,`,`,`,`,`,`,~,~,`,`,`,`,`,`,`,`,`,~,`,`,`,`,#
+,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,`,`,,,,,w,,,,w,,,,,,#
+,,,,,,,,,,,,,,`,`,,,,,w,,,,w,,,,,,#
+,,,,,,,,,,,,,,`,`,,,,,w,,,,w,,,,,,#
+,,,s(10x1),,,,,,,,,,,`,`,,w,w,w,w,w,w,w,w,w,,,,,#
+,,,,,,,,,,,,,,`,`,,,,,w,,,,w,,,,,,#
+,,,,,,,,,,,,,,`,`,,,,,w,,,,w,,,,,,#
+,,,,,,,,,,,,,,`,`,,,,,w,,,,w,,,,,,#
+,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+#build label(workshops2_doors) hidden() start(15;10; top left corner of central stairs) Fill in doors to the workrooms.
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,d,,,d,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,d,,,d,,,,,,,,,,,,,,#
+,d,,,d,,,,,,,,d,,,,,d,,,,,,,,d,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,d,,,d,,,,,,,,d,,,,,d,,,,,,,,d,,,,,#
+,,,,,,,,,,,,,d,,,d,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,d,,,d,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+"#dig label(storeroom1) start(15;10; Top left corner of central stairs) Just four big rooms, suitable for storerooms"
+d,d,d,d,i,d,d,d,d,d,d,d,d,d,i,i,d,d,d,d,d,d,d,d,d,i,d,d,d,d,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,d,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,d,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,d,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,d,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,d,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,d,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
+,,,,d,,,,,,,,d,,d,d,,d,,,,,,,,d,,,,,#
+d,d,d,d,i,d,d,d,d,d,d,d,d,d,i,i,d,d,d,d,d,d,d,d,d,i,d,d,d,d,#
+d,d,d,d,i,d,d,d,d,d,d,d,d,d,i,i,d,d,d,d,d,d,d,d,d,i,d,d,d,d,#
+,,,,d,,,,,,,,d,,d,d,,d,,,,,,,,d,,,,,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,d,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,d,d,d,d,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,,,,,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,,,,,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,,,,,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,,d,d,,d,d,d,d,d,d,d,d,d,,,,,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,d,i,i,d,d,d,d,d,d,d,d,d,d,,,,,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+#meta label(storeroom2a) General stockpiles
+/storeroom2a_place
+/storeroom2_doors
+"#meta label(storeroom2b) Extra storage for wood, food and furniture"
+/storeroom2b_place
+/storeroom2_doors
+#place label(storeroom2a_place) hidden() start(15;10; top left corner of central stairs) General stockpiles
+g(6x8),,,,x(1x1),,l(7x8),,,,,,,,,,,d(7x5),,,,,,,p(6x5),x(1x1),,,,,#
+,,,,,,,,,,,,,`,,,`,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,`,,,`,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,`,,,`,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,`,,,`,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,`,,,`,b(7x3),,,,,,,z(6x3),,,,,,#
+,,,,,,,,,,,,,`,,,`,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+`,`,`,`,,`,`,`,`,`,`,`,,`,,,`,,`,`,`,`,`,`,`,,`,`,`,`,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+`,`,`,`,,`,`,`,`,`,`,`,,`,,,`,,`,`,`,`,`,`,`,,`,`,`,`,#
+u(13x8),,,,,,,,,,,,,,,,,u(7x8),,,,,,,w(6x8),,,,,,#
+,,,,,,,,,,,,,`,,,`,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,`,,,`,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,`,,,`,,,,,,,,,,x(4x5),,,`,#
+,,,,,,,,,,,,,`,,,`,,,,,,,,,,`,,,,#
+,,,,,,,,,,,,,`,,,`,,,,,,,,,,`,,,,#
+,,,,,,,,,,,,,`,,,`,,,,,,,,,,`,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,`,,,,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+"#place label(storeroom2b_place) hidden() start(15;10; top left corner of central stairs) Extra storage for wood, food and furniture"
+w(13x8),,,,x(1x1),,,,,,,,,,,,,f(13x8),,,,,,,,x(1x1),,,,,#
+,,,,,,,,,,,,,`,,,`,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,`,,,`,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,`,,,`,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,`,,,`,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,`,,,`,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,`,,,`,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+`,`,`,`,,`,`,`,`,`,`,`,,`,,,`,,`,`,`,`,`,`,`,,`,`,`,`,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+`,`,`,`,,`,`,`,`,`,`,`,,`,,,`,,`,`,`,`,`,`,`,,`,`,`,`,#
+u(13x8),,,,,,,,,,,,,,,,,u(13x8),,,,,,,,,,,,,#
+,,,,,,,,,,,,,`,,,`,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,`,,,`,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,`,,,`,,,,,,,,,,x(4x5),,,`,#
+,,,,,,,,,,,,,`,,,`,,,,,,,,,,`,,,,#
+,,,,,,,,,,,,,`,,,`,,,,,,,,,,`,,,,#
+,,,,,,,,,,,,,`,,,`,,,,,,,,,,`,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,`,,,,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+#build label(storeroom2_doors) hidden() start(15;10; top left corner of central stairs) Build storeroom doors
+,,,,,,,,,,,,,d,,,d,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,d,,,d,,,,,,,,,,,,,,#
+,,,,d,,,,,,,,d,,,,,d,,,,,,,,d,,,,d,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,d,,,,,,,,d,,,,,d,,,,,,,,d,,,,d,#
+,,,,,,,,,,,,,d,,,d,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,d,,,d,,,,,,,,,,,,,,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+#dig label(bedrooms1) start(15;10; top left corner of central stairs) Bedroom complex
+d,d,d,,i,,d,d,d,,d,d,d,,i,i,,d,d,d,,d,d,d,,i,,,,,#
+d,d,d,d,d,d,d,d,d,,d,d,d,d,d,d,d,d,d,d,,d,d,d,d,d,,d,d,,#
+,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,d,d,,#
+d,d,d,d,d,d,d,d,d,,d,d,d,d,d,d,d,d,d,d,,d,d,d,d,d,d,d,d,,#
+,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
+d,,d,,d,,d,,d,,d,d,d,d,d,d,d,d,d,d,,d,,d,,d,,d,d,,#
+d,,d,,d,,d,,d,,,,,,d,d,,,,,,d,,d,,d,,d,d,,#
+d,,d,,d,,d,,d,,,d,d,d,d,d,d,d,d,,,d,,d,,d,d,d,d,,#
+d,,d,,d,,d,,d,,d,d,d,d,d,d,d,d,d,d,,d,,d,,d,,,,,#
+d,d,d,d,i,d,d,d,d,d,d,d,d,d,i,i,d,d,d,d,d,d,d,d,d,i,d,d,d,d,#
+d,d,d,d,i,d,d,d,d,d,d,d,d,d,i,i,d,d,d,d,d,d,d,d,d,i,d,d,d,d,#
+d,,d,,d,,d,,d,,d,d,d,d,d,d,d,d,d,d,,d,,d,,d,,,,,#
+d,,d,,d,,d,,d,,,d,d,d,d,d,d,d,d,,,d,,d,,d,d,d,d,,#
+d,,d,,d,,d,,d,,,,,,d,d,,,,,,d,,d,,d,,d,d,,#
+d,,d,,d,,d,,d,,d,d,d,d,d,d,d,d,d,d,,d,,d,,d,,d,d,,#
+,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
+d,d,d,d,d,d,d,d,d,,d,d,d,d,d,d,d,d,d,d,,d,d,d,d,d,,,,,#
+,,,,d,,,,,,,,,,d,d,,,,,,,,,,d,,,,,#
+d,d,d,d,d,d,d,d,d,,d,d,d,d,d,d,d,d,d,d,,d,d,d,d,d,,,,,#
+,,,,i,,,,,,,,,,i,i,,,,,,,,,,i,,,,,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+#build label(bedrooms2) start(15;10; top left corner of central stairs) Bedroom furniture
+f,h,h,,,,h,h,f,,f,h,h,,,,,h,h,f,,f,h,h,,,,,,,#
+b,,,d,,d,,,b,,b,,,d,,,d,,,b,,b,,,d,,,f,h,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,h,,#
+b,f,h,d,,d,h,f,b,,b,f,h,d,,,d,h,f,b,,b,f,h,d,,d,,b,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+b,,b,,,,b,,b,,b,f,h,d,,,d,h,f,b,,b,,b,,,,f,h,,#
+f,,f,,,,f,,f,,,,,,,,,,,,,f,,f,,,,,h,,#
+h,,h,,,,h,,h,,,t,t,,,,,,,,,h,,h,,,d,,b,,#
+d,,d,,,,d,,d,,,c,c,,,,,,,,,d,,d,,,,,,,#
+,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
+d,,d,,,,d,,d,,,,,,,,,c,c,,,d,,d,,,,,,,#
+h,,h,,,,h,,h,,,,,,,,,t,t,,,h,,h,,,d,,h,,#
+f,,f,,,,f,,f,,,,,,,,,,,,,f,,f,,,,,h,,#
+b,,b,,,,b,,b,,b,f,h,d,,,d,h,f,b,,b,,b,,,,f,b,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+b,f,h,d,,d,h,f,b,,b,f,h,d,,,d,h,f,b,,b,f,h,d,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+b,f,h,d,,d,h,f,b,,b,f,h,d,,,d,h,f,b,,b,f,h,d,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+#query label(bedrooms3) start(15;10; top left corner of central stairs) Makes bedrooms and small dining rooms from beds and tables
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+r+,,,,,,,,r+,,r+,,,,,,,,,r+,,r+,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+r+,,,,,,,,r+,,r+,,,,,,,,,r+,,r+,,,,,,,r+,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+r+,,r+,,,,r+,,r+,,r+,,,,,,,,,r+,,r+,,r+,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,r++&,,,,,,,,,,,,,,,,,r+,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,r++&,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+r+,,r+,,,,r+,,r+,,r+,,,,,,,,,r+,,r+,,r+,,,,,r+,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+r+,,,,,,,,r+,,r+,,,,,,,,,r+,,r+,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+r+,,,,,,,,r+,,r+,,,,,,,,,r+,,r+,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+#dig label(plumbing1) start(15;10; top left corner of central stairs) Plumbing for the waterfall system
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,h,h,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,h,,,,,,,,,h,,,,,,,,,,,#
+,,,,,,,,,,h,,,,,,,,,h,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,h,h,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,h,h,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,d,d,d,d,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,d,,h,h,#
+,,,,,,,,,,,,,,,,,,,,,,,,,i,d,,d,d,#
+#>,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,h,h,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,h,,,,,,,,,h,,,,,,,,,,,#
+,,,,,,,,,,h,,,,,,,,,h,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,h,h,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,d,d,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,h,h,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,d,d,d,d,#
+,,,,,,,,,,,,,,,,,,,,,,,,,i,d,,h,h,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+"#build label(plumbing2) start(15;10; top left corner of central stairs) Grates, doors, and screw pumps for the waterfall plumbing"
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,G,G,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,G,,,,,,,,,G,,,,,,,,,,,#
+,,,,,,,,,,G,,,,,,,,,G,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,G,G,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,`,`,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,d,Msm,Msm,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,~,#
+#<,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,G,G,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,G,,,,,,,,,G,,,,,,,,,,,#
+,,,,,,,,,,G,,,,,,,,,G,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,G,G,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,~,~,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,d,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,Msu,Msu,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,`,`,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+#dig label(waterfall1) start(15;10; top left corner of central stairs) Top-level plumbing for the waterfall system
+,,,,i,,,,,,,,,,i,i,,,,,,,,,,i,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
+,,,,,,d,,,,,,,,,,,,,,,,,,,,,,,d,#
+,,,,,,d,,,,,,,,d,d,d,d,d,d,d,d,d,d,d,d,d,d,,d,#
+,,,,,,d,,,,,,,,h,h,,,,,,,,,,,,d,,d,#
+,,,,,,d,,,,,,,,,,,,,,,,,,,,,d,,d,#
+,,,,,,d,,,,,,,,,,,,,,,,,,,,,d,,d,#
+,,,,,,d,,,,,,,,,,,,,,,,,,,,,d,,d,#
+,,,,i,,d,d,d,d,h,,,,i,i,,,,h,d,d,d,d,,i,,d,,d,#
+,,,,i,,d,d,d,d,h,,,,i,i,,,,h,d,d,d,d,,i,,d,d,d,#
+,,,,,,,,,,,,,,,,,,,,,,,d,,,,,d,d,#
+,,,,,,,,,,,,,,,,,,,,,,,d,d,d,d,d,d,d,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,d,d,d,#
+,,,,,,,,,,,,,,h,h,,,,d,d,d,d,d,d,d,d,d,d,d,#
+,,,,,,,,,,,,,,d,d,,,,d,,,,,,,,,d,d,#
+,,,,,,,,,,,,,,d,d,d,d,d,d,,d,d,d,,d,d,d,d,d,#
+,,,,,,,,,,,,,,,,,,,,,d,d,d,d,d,,,d,d,#
+,,,,,,,,,,,,,,d,d,d,d,d,d,d,d,d,d,,d,d,d,d,d,#
+,,,,i,,,,,,,,,,i,i,,,,,,,,,,i,,,d,d,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+"#build label(waterfall2) start(15;10; top left corner of central stairs) message(Remember to link the levers and lock the doors manually) Floodgates, screw pumps, bridges and levers to control flow"
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,x,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,x,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,`,`,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,x,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,gw(2x1),,#
+,,,,,,,,,,,,,,,,x,,,,,,Tl,,,,,d,,,#
+,,,,,,,,,,,,,,,,,,,,,Tl,Tl,Tl,d,,,,,,#
+,,,,,,,,,,,,,,,,,,,,,,Tl,,,,,d,Msm,Msm,#
+,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
diff --git a/data/blueprints/library/tombs/Mini_Saracen.csv b/data/blueprints/library/tombs/Mini_Saracen.csv
new file mode 100644
index 000000000..f30fbc55d
--- /dev/null
+++ b/data/blueprints/library/tombs/Mini_Saracen.csv
@@ -0,0 +1,26 @@
+#dig start(6;6) room for 24 corpses
+d, ,d, ,d, ,d, ,d, ,d,#
+d,d,d,d,d,d,d,d,d,d,d,#
+d, ,d, ,d,d,d, ,d, ,d,#
+ , , , ,d,d,d, , , , ,#
+d, ,d,d,i,i,i,d,d, ,d,#
+d,d,d,d,i,i,i,d,d,d,d,#
+d, ,d,d,i,i,i,d,d, ,d,#
+ , , , ,d,d,d, , , , ,#
+d, ,d, ,d,d,d, ,d, ,d,#
+d,d,d,d,d,d,d,d,d,d,d,#
+d, ,d, ,d, ,d, ,d, ,d,#
+#,#,#,#,#,#,#,#,#,#,#,#
+#build label(urns) start(6;6) message(use burial script to mark urns as usable) 24 urns
+n, ,n, ,n, ,n, ,n, ,n,#
+`,`,`,`,`,`,`,`,`,`,`,#
+n, ,n, ,`,`,`, ,n, ,n,#
+ , , , ,`,`,`, , , , ,#
+n, ,`,`,~,~,~,`,`, ,n,#
+`,`,`,`,~,~,~,`,`,`,`,#
+n, ,`,`,~,~,~,`,`, ,n,#
+ , , , ,`,`,`, , , , ,#
+n, ,n, ,`,`,`, ,n, ,n,#
+`,`,`,`,`,`,`,`,`,`,`,#
+n, ,n, ,n, ,n, ,n, ,n,#
+#,#,#,#,#,#,#,#,#,#,#,#
diff --git a/data/blueprints/library/tombs/The_Saracen_Crypts.csv b/data/blueprints/library/tombs/The_Saracen_Crypts.csv
new file mode 100644
index 000000000..a70b77a09
--- /dev/null
+++ b/data/blueprints/library/tombs/The_Saracen_Crypts.csv
@@ -0,0 +1,99 @@
+#dig start(24;25) room for 513 corpses
+# see an image of this blueprint at https://i.imgur.com/Kcjvx6R.png
+d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,d,d,d,d,d,d,d,d,d,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
+d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
+ , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , ,#
+d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
+d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
+ , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , ,#
+d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
+d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
+ , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , ,#
+d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
+d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
+ , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , ,#
+d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
+d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
+ , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , ,#
+d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,d,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , ,d,d,d, , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
+d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,d,d,d,i,i,i,d,d,d,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
+ , , , , , , , , , , , , , , , , , ,d,d,d,d,i,i,i,d,d,d,d, , , , , , , , , , , , , , , , , , ,#
+d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,d,d,d,i,i,i,d,d,d,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , ,d,d,d, , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
+d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,d,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
+ , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , ,#
+d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
+d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
+ , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , ,#
+d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
+d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
+ , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , ,#
+d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
+d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
+ , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , ,#
+d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
+d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
+ , , , , , , , , , , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , , , , , , , , , , ,#
+d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
+d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d, , , , , , , , , ,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,#
+d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,d,d,d,d,d,d,d,d,d,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d, ,d,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
+#build label(urns) start(24;24) message(use burial script to mark urns as usable) 513 urns
+n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`,`,`,`,`,`,`,`,`,`,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
+`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
+n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
+ , , , , , , , , , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , , , , , , , , , ,#
+n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
+`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
+n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
+ , , , , , , , , , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , , , , , , , , , ,#
+n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
+`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
+n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
+ , , , , , , , , , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , , , , , , , , , ,#
+n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
+`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
+n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
+ , , , , , , , , , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , , , , , , , , , ,#
+n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
+`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
+n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
+ , , , , , , , , , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , , , , , , , , , ,#
+n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n,`,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
+`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`, , , ,`,`,`, , , ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
+n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`,`,`,`,~,~,~,`,`,`,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
+ , , , , , , , , , , , , , , , , , ,`,`,`,`,~,~,~,`,`,`,`, , , , , , , , , , , , , , , , , , ,#
+n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`,`,`,`,~,~,~,`,`,`,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
+`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`, , , ,`,`,`, , , ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
+n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n,`,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
+ , , , , , , , , , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , , , , , , , , , ,#
+n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
+`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
+n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
+ , , , , , , , , , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , , , , , , , , , ,#
+n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
+`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
+n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
+ , , , , , , , , , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , , , , , , , , , ,#
+n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
+`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
+n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
+ , , , , , , , , , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , , , , , , , , , ,#
+n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
+`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
+n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
+ , , , , , , , , , , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , , , , , , , , , , ,#
+n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
+`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`, , , , , , , , , ,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,`,#
+n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,`,`,`,`,`,`,`,`,`,`, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n, ,n,#
+#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#
diff --git a/data/quickfort/aliases-common.txt b/data/quickfort/aliases-common.txt
new file mode 100644
index 000000000..e4d2ef1cd
--- /dev/null
+++ b/data/quickfort/aliases-common.txt
@@ -0,0 +1,463 @@
+# Common baseline for aliases for quickfort query mode blueprints.
+#
+# Please DO NOT EDIT this file directly. It will get overwritten when DFHack
+# is updated. Instead, custom aliases should be added to
+# dfhack-config/quickfort/aliases.txt. See that file for syntax documentation.
+#
+# The aliases in this file were tested in DF 0.47.04 on 2020 Jul 18.
+#
+# The aliases are generally split into three categories:
+# 1) The aliases that name a type disable everything else for that stockpile
+# category and enable only that type. For example, "preparedfood" enables
+# prepared food and disables all other types of food.
+# 2) The aliases that start with "forbid" only forbid (or toggle) the named type
+# and leave the rest of the stockpile untouched.
+# 3) The aliases that start with "permit" only permit (or toggle) the named type
+# and leave the rest of the stockpile untouched.
+#
+# Aliases that don't fit into those two categories have comments explaining
+# their usage.
+
+
+########################################
+# general purpose stockpile adjustments
+########################################
+
+linksonly: a
+nocontainers: CE
+
+# for configuring stockpiles to give to other nearby stockpiles/workshops
+give: g{move}&
+give2up: {give move={Up 2}}
+give2down: {give move={Down 2}}
+give2left: {give move={Left 2}}
+give2right: {give move={Right 2}}
+give10up: {give move={Up 10}}
+give10down: {give move={Down 10}}
+give10left: {give move={Left 10}}
+give10right: {give move={Right 10}}
+
+# Keep in mind that building, stockpile, and zone names have a maximum length
+# of 20 characters. usage example: {givename name="myname"}
+givename: {Ctrl}n{name}&
+
+# use to toggle a sequence of stockpile options. for example: {togglesequence 5}
+togglesequence: &{Down}
+togglesequence2: &{Down 2}
+enablesequence: e{Down}
+
+# Enables everything but corpses and refuse. Refuse is excluded since otherwise
+# clothes and armor in this quantum stockpile will rot away. If you want bones
+# in your quantum stockpile, apply this alias to a refuse stockpile (but don't
+# put useful clothes or armor in there!)
+# Optionally set a name for the stockpile by specifying the 'name' parameter,
+# for example: {quantum name="my name"}
+quantum: {linksonly}{nocontainers}{enableanimals}{enablefood}{enablefurniture}{enablestone}{enableammo}{enablecoins}{enablebars}{enablegems}{enablefinishedgoods}{enableleather}{enablecloth}{enablewood}{enableweapons}{enablearmor}{enablesheet}{givename}
+
+
+##################################
+# hauling aliases
+##################################
+
+# Run one of the quantumstopfrom* aliases over a track stop that is set to dump
+# into a quantum stockpile. The alias will set up the stop to accept all types
+# (the actual types stored in the quantum stockpile should be controlled by the
+# feeder stockpile) and link the indicated adjacent feeder stockpile. For
+# example, the quantumstopfromsouth alias should be used over a track stop set
+# to dump to the North and take items from a feeder stockpile one tile to the
+# South. All you need to do afterwards is assign a vehicle to the stop. The
+# track stop does not need to be constructed yet, but the feeder stockpile needs
+# to exist so we can link to it.
+#
+# Be sure to define the optional 'name' parameter if you want to give your
+# quantum hauling routes custom names. Keep in mind that names have a maximum
+# length of 22 characters. For example:
+# {quantumstopfromsouth name="Trash Dump"}
+#
+# For several examples of these aliases, see
+# https://docs.google.com/spreadsheets/d/1gvTJxxRxZ5V4vXkqwhL-qlr_lXCNt8176TK14m4kSOU
+namelastrouteprefix: ^h--n
+namelastroutesuffix: &^q
+namelastroute: {namelastrouteprefix}{name}{namelastroutesuffix}
+quantumstopprefix: ^hrs&xxx&{enablesequence 17}^
+quantumstopsuffix: ^q{namelastroute}
+quantumstopfromeast: {quantumstopprefix}s{Right}p^{Left}{quantumstopsuffix}
+quantumstopfromsouth: {quantumstopprefix}s{Down}p^{Up}{quantumstopsuffix}
+quantumstopfromwest: {quantumstopprefix}s{Left}p^{Right}{quantumstopsuffix}
+quantumstopfromnorth: {quantumstopprefix}s{Up}p^{Down}{quantumstopsuffix}
+
+
+##################################
+# zone aliases
+##################################
+
+# usage example: {namezone name="my zone name"}
+namezone: ^i{givename}^q
+
+
+##################################
+# animal stockpile adjustments
+##################################
+
+animalsprefix: s
+enableanimals: {animalsprefix}e^
+disableanimals: {animalsprefix}d^
+
+cages: {animalsprefix}bu^
+traps: {animalsprefix}bj^
+
+forbidcages: {animalsprefix}u^
+forbidtraps: {animalsprefix}j^
+
+permitcages: {forbidcages}
+permittraps: {forbidtraps}
+
+
+##################################
+# food stockpile adjustments
+##################################
+
+foodprefix: s{Down}
+enablefood: {foodprefix}e^
+disablefood: {foodprefix}d^
+
+preparedfood: {foodprefix}bu^
+unpreparedfish: {foodprefix}b{Right}{Down 2}p^
+plants: {foodprefix}b{Right}{Down 4}p^
+booze: {foodprefix}b{Right}{Down 5}p{Down}p^
+seeds: {foodprefix}b{Right}{Down 9}p^
+dye: {foodprefix}b{Right}{Down 11}{Right}{Down 28}{togglesequence 4}^
+tallow: {foodprefix}b{Right}{Down 13}{Right}{Down}{togglesequence2 811}^
+miscliquid: {foodprefix}b{Right}{Down 18}p^
+
+forbidpreparedfood: {foodprefix}u^
+forbidunpreparedfish: {foodprefix}{Right}{Down 2}f^
+forbidplants: {foodprefix}{Right}{Down 4}f^
+forbidbooze: {foodprefix}{Right}{Down 5}f{Down}f^
+forbidseeds: {foodprefix}{Right}{Down 9}f^
+forbiddye: {foodprefix}{Right}{Down 11}{Right}{Down 28}{togglesequence 4}^
+forbidtallow: {foodprefix}{Right}{Down 13}{Right}{Down}{togglesequence2 811}^
+forbidmiscliquid: {foodprefix}{Right}{Down 18}f^
+
+permitpreparedfood: {forbidpreparedfood}
+permitunpreparedfish: {foodprefix}{Right}{Down 2}p^
+permitplants: {foodprefix}{Right}{Down 4}p^
+permitbooze: {foodprefix}{Right}{Down 5}p{Down}p^
+permitseeds: {foodprefix}{Right}{Down 9}p^
+permitdye: {forbiddye}
+permittallow: {forbidtallow}
+permitmiscliquid: {foodprefix}{Right}{Down 18}p^
+
+# enables everything but seeds
+noseeds: {disablefood}{enablefood}{forbidseeds}
+
+# enables all food except for the types listed above
+food: {noseeds}{forbidpreparedfood}{forbidunpreparedfish}{forbidplants}{forbidbooze}{forbiddye}{forbidtallow}{forbidmiscliquid}
+
+
+##################################
+# furniture stockpile adjustments
+##################################
+
+furnitureprefix: s{Down 2}
+enablefurniture: {furnitureprefix}e^
+disablefurniture: {furnitureprefix}d^
+
+pots: {furnitureprefix}de{Right}f{Right}{Up 5}&^
+bags: {furnitureprefix}de{Right}f{Right}{Up 10}&{Left}{Down}f{Down}f{Down}f{Right}{Down}&{Down 6}&{Down}&{Down 6}&^
+buckets: {furnitureprefix}de{Right}f{Right}{Up 12}&^
+sand: {furnitureprefix}de{Right}f{Right}{Up}&^
+
+
+###########################################
+# corpses and refuse stockpile adjustments
+###########################################
+
+corpsesprefix: s{Down 3}
+enablecorpses: {corpsesprefix}e^
+disablecorpses: {corpsesprefix}d{Up}d^
+
+refuseprefix: s{Down 4}
+enablerefuse: {refuseprefix}e^
+disablerefuse: {refuseprefix}d^
+
+# bodyparts include remains/corpses and rotten rawhdes
+bodyparts: {refuseprefix}b{Right 2}&{Down 2}&{Left}{Down}p{Down}p^
+rawhides: {refuseprefix}b{Right 2}{Down}&^
+tannedhides: {refuseprefix}b{Right 2}{Down 53}&^
+skulls: {refuseprefix}b{Right}{Down 3}p^
+bones: {refuseprefix}b{Right}{Down 4}p^
+shells: {refuseprefix}b{Right}{Down 5}p^
+teeth: {refuseprefix}b{Right}{Down 6}p^
+horns: {refuseprefix}b{Right}{Down 7}p^
+hair: {refuseprefix}b{Right}{Down 8}p^
+craftrefuse: {skulls}{permitbones}{permitshells}{permitteeth}{permithorns}{permithair}
+
+forbidbodyparts: {refuseprefix}{Right 2}&{Down 2}&{Left}{Down}f{Down}f^
+forbidrawhides: {refuseprefix}{Right 2}{Down}&^
+forbidtannedhides: {refuseprefix}{Right 2}{Down 53}&^
+forbidskulls: {refuseprefix}{Right}{Down 3}f^
+forbidbones: {refuseprefix}{Right}{Down 4}f^
+forbidshells: {refuseprefix}{Right}{Down 5}f^
+forbidteeth: {refuseprefix}{Right}{Down 6}f^
+forbidhorns: {refuseprefix}{Right}{Down 7}f^
+forbidhair: {refuseprefix}{Right}{Down 8}f^
+forbidcraftrefuse: {forbidskulls}{forbidbones}{forbidshells}{forbidteeth}{forbidhorns}{forbidhair}
+
+permitbodyparts: {refuseprefix}{Right 2}&{Down 2}&{Left}{Down}p{Down}p^
+permitrawhides: {forbidrawhides}
+permittannedhides: {forbidtannedhides}
+permitskulls: {refuseprefix}{Right}{Down 3}p^
+permitbones: {refuseprefix}{Right}{Down 4}p^
+permitshells: {refuseprefix}{Right}{Down 5}p^
+permitteeth: {refuseprefix}{Right}{Down 6}p^
+permithorns: {refuseprefix}{Right}{Down 7}p^
+permithair: {refuseprefix}{Right}{Down 8}p^
+permitcraftrefuse: {permitskulls}{permitbones}{permitshells}{permitteeth}{permithorns}{permithair}
+
+
+##################################
+# stone stockpile adjustments
+##################################
+
+stoneprefix: s{Down 5}
+enablestone: {stoneprefix}e^
+disablestone: {stoneprefix}d^
+
+metal: {stoneprefix}b{Right}p^
+iron: {stoneprefix}b{Right}{Right}&{Down}&{Down 13}&^
+economic: {stoneprefix}b{Right}{Down}p^
+flux: {stoneprefix}b{Right}{Down}{Right}{togglesequence 4}{Down 4}&^
+plaster: {stoneprefix}b{Right}{Down}{Right}{Down 6}&{Down 3}{togglesequence 3}^
+coalproducing: {stoneprefix}b{Right}{Down}{Right}{Down 4}{togglesequence 2}^
+otherstone: {stoneprefix}b{Right}{Down 2}p^
+bauxite: {stoneprefix}b{Right}{Down 2}{Right}{Down 42}&^
+clay: {stoneprefix}b{Right}{Down 3}p^
+
+forbidmetal: {stoneprefix}{Right}f^
+forbidiron: {stoneprefix}{Right}{Right}&{Down}&{Down 13}&^
+forbideconomic: {stoneprefix}{Right}{Down}f^
+forbidflux: {stoneprefix}{Right}{Down}{Right}{togglesequence 4}{Down 4}&^
+forbidplaster: {stoneprefix}{Right}{Down}{Right}{Down 6}&{Down 3}{togglesequence 3}^
+forbidcoalproducing: {stoneprefix}{Right}{Down}{Right}{Down 4}{togglesequence 2}^
+forbidotherstone: {stoneprefix}{Right}{Down 2}f^
+forbidbauxite: {stoneprefix}{Right}{Down 2}{Right}{Down 42}&^
+forbidclay: {stoneprefix}{Right}{Down 3}f^
+
+permitmetal: {stoneprefix}{Right}p^
+permitiron: {forbidiron}
+permiteconomic: {stoneprefix}{Right}{Down}p^
+permitflux: {forbidflux}
+permitplaster: {forbidplaster}
+permitcoalproducing: {forbidcoalproducing}
+permitotherstone: {stoneprefix}{Right}{Down 2}p^
+permitbauxite: {forbidbauxite}
+permitclay: {stoneprefix}{Right}{Down 3}p^
+
+
+##################################
+# ammo stockpile adjustments
+##################################
+
+ammoprefix: s{Down 6}
+enableammo: {ammoprefix}e^
+disableammo: {ammoprefix}d^
+
+bolts: {ammoprefix}a{Right 2}{Down}{togglesequence 2}^
+
+forbidmetalbolts: {ammoprefix}{Right}{Down}f^
+forbidwoodenbolts: {ammoprefix}{Right}{Down 2}{Right}&^
+forbidbonebolts: {ammoprefix}{Right}{Down 2}{Right}{Down}&^
+
+
+##################################
+# bar stockpile adjustments
+##################################
+
+barsprefix: s{Down 8}
+enablebars: {barsprefix}e^
+disablebars: {barsprefix}d^
+
+bars: {barsprefix}b{Right}p{Down}p^
+metalbars: {barsprefix}b{Right}p^
+ironbars: {barsprefix}b{Right 2}&^
+steelbars: {barsprefix}b{Right 2}{Down 8}&^
+pigironbars: {barsprefix}b{Right 2}{Down 9}&^
+otherbars: {barsprefix}b{Right}{Down}p^
+coal: {barsprefix}b{Right}{Down}{Right}&^
+potash: {barsprefix}b{Right}{Down}{Right}{Down}&^
+ash: {barsprefix}b{Right}{Down}{Right}{Down 2}&^
+pearlash: {barsprefix}b{Right}{Down}{Right}{Down 3}&^
+soap: {barsprefix}b{Right}{Down}{Right}{Down 4}&^
+blocks: {barsprefix}b{Down 2}p{Down}p{Down}p^
+
+forbidbars: {barsprefix}{Right}f{Down}f^
+forbidmetalbars: {barsprefix}{Right}f^
+forbidironbars: {barsprefix}{Right 2}&^
+forbidsteelbars: {barsprefix}{Right 2}{Down 8}&^
+forbidpigironbars: {barsprefix}{Right 2}{Down 9}&^
+forbidotherbars: {barsprefix}{Right}{Down}f^
+forbidcoal: {barsprefix}{Right}{Down}{Right}&^
+forbidpotash: {barsprefix}{Right}{Down}{Right}{Down}&^
+forbidash: {barsprefix}{Right}{Down}{Right}{Down 2}&^
+forbidpearlash: {barsprefix}{Right}{Down}{Right}{Down 3}&^
+forbidsoap: {barsprefix}{Right}{Down}{Right}{Down 4}&^
+forbidblocks: {barsprefix}{Down 2}f{Down}f{Down}f^
+
+
+##################################
+# gem stockpile adjustments
+##################################
+
+gemsprefix: s{Down 9}
+enablegems: {gemsprefix}e^
+disablegems: {gemsprefix}d^
+
+roughgems: {gemsprefix}b{Right}p^
+roughglass: {gemsprefix}b{Right}{Down}p^
+cutgems: {gemsprefix}b{Right}{Down 2}p^
+cutglass: {gemsprefix}b{Right}{Down 3}p^
+cutstone: {gemsprefix}b{Right}{Down 4}p^
+
+forbidroughgems: {gemsprefix}{Right}f^
+forbidroughglass: {gemsprefix}{Right}{Down}f^
+forbidcutgems: {gemsprefix}{Right}{Down 2}f^
+forbidcutglass: {gemsprefix}{Right}{Down 3}f^
+forbidcutstone: {gemsprefix}{Right}{Down 4}f^
+
+
+#######################################
+# finished goods stockpile adjustments
+#######################################
+
+finishedgoodsprefix: s{Down 10}
+enablefinishedgoods: {finishedgoodsprefix}e^
+disablefinishedgoods: {finishedgoodsprefix}d^
+
+jugs: {finishedgoodsprefix}{Right}f{Right}{Up 2}&{Left}{Down 2}f{Down}f{Down}f^
+
+
+##################################
+# cloth
+##################################
+
+clothprefix: s{Down 12}
+enablecloth: {clothprefix}e^
+disablecloth: {clothprefix}d^
+
+thread: {clothprefix}b{Right}p{Down}p{Down}p^
+adamantinethread: {clothprefix}b{Right}{Down 3}p^
+cloth: {clothprefix}b{Right}{Down 4}p{Down}p{Down}p^
+adamantinecloth: {clothprefix}b{Right}{Up}p^
+
+
+##################################
+# weapon stockpile adjustments
+##################################
+
+weaponsprefix: s{Down 14}
+enableweapons: {weaponsprefix}e^
+disableweapons: {weaponsprefix}d^
+
+metalweapons: {forbidtrapcomponents}{forbidstoneweapons}{forbidotherweapons}
+ironweapons: {metalweapons}{forbidweapons}{permitironweapons}
+copperweapons: {metalweapons}{forbidweapons}{permitcopperweapons}
+steelweapons: {metalweapons}{forbidweapons}{permitsteelweapons}
+
+forbidweapons: {weaponsprefix}{Right}f^
+forbidtrapcomponents: {weaponsprefix}{Right}{Down}f^
+forbidmetalweapons: {weaponsprefix}{Right}{Down 2}f^
+forbidstoneweapons: {weaponsprefix}{Right}{Down 3}f^
+forbidotherweapons: {weaponsprefix}{Right}{Down 4}f^
+forbidironweapons: {weaponsprefix}{Right}{Down 2}{Right}&^
+forbidcopperweapons: {weaponsprefix}{Right}{Down 2}{Right}{Down 3}&^
+forbidsteelweapons: {weaponsprefix}{Right}{Down 2}{Right}{Down 8}&^
+
+permitweapons: {weaponsprefix}{Right}p^
+permittrapcomponents: {weaponsprefix}{Right}{Down}p^
+permitmetalweapons: {weaponsprefix}{Right}{Down 2}p^
+permitstoneweapons: {weaponsprefix}{Right}{Down 3}p^
+permitotherweapons: {weaponsprefix}{Right}{Down 4}p^
+permitironweapons: {forbidironweapons}
+permitcopperweapons: {forbidcopperweapons}
+permitsteelweapons: {forbidsteelweapons}
+
+masterworkweapons: {weaponsprefix}{Right}{Down 5}f{Right}{Down 5}&^
+artifactweapons: {weaponsprefix}{Right}{Down 5}f{Right}{Down 6}&^
+
+forbidmasterworkweapons: {weaponsprefix}{Right}{Down 5}{Right}{Down 5}&^
+forbidartifactweapons: {weaponsprefix}{Right}{Down 5}{Right}{Down 6}&^
+
+permitmasterworkweapons: {forbidmasterworkweapons}
+permitartifactweapons: {forbidartifactweapons}
+
+
+##################################
+# armor stockpile adjustments
+##################################
+
+armorprefix: s{Down 15}
+enablearmor: {armorprefix}e^
+disablearmor: {armorprefix}d^
+
+metalarmor: {forbidotherarmor}
+otherarmor: {forbidmetalarmor}
+ironarmor: {metalarmor}{forbidmetalarmor}{permitironarmor}
+copperarmor: {metalarmor}{forbidmetalarmor}{permitcopperarmor}
+steelarmor: {metalarmor}{forbidmetalarmor}{permitsteelarmor}
+
+forbidmetalarmor: {armorprefix}{Right}{Down 6}f^
+forbidotherarmor: {armorprefix}{Right}{Down 7}f^
+forbidironarmor: {armorprefix}{Right}{Down 6}{Right}&^
+forbidcopperarmor: {armorprefix}{Right}{Down 6}{Right}{Down 3}&^
+forbidsteelarmor: {armorprefix}{Right}{Down 6}{Right}{Down 8}&^
+
+permitmetalarmor: {armorprefix}{Right}{Down 6}p^
+permitotherarmor: {armorprefix}{Right}{Down 7}p^
+permitironarmor: {forbidironarmor}
+permitcopperarmor: {forbidcopperarmor}
+permitsteelarmor: {forbidsteelarmor}
+
+masterworkarmor: {armorprefix}{Right}{Down 8}f{Right}{Down 5}&^
+artifactarmor: {armorprefix}{Right}{Down 8}f{Right}{Down 6}&^
+
+forbidmasterworkarmor: {armorprefix}{Right}{Down 8}{Right}{Down 5}&^
+forbidartifactarmor: {armorprefix}{Right}{Down 8}{Right}{Down 6}&^
+
+permitmasterworkarmor: {forbidmasterworkarmor}
+permitartifactarmor: {forbidartifactarmor}
+
+
+##################################
+# others
+##################################
+
+coinsprefix: s{Down 7}
+enablecoins: {coinsprefix}e^
+disablecoins: {coinsprefix}d^
+
+leatherprefix: s{Down 11}
+enableleather: {leatherprefix}e^
+disableleather: {leatherprefix}d^
+
+woodprefix: s{Down 13}
+enablewood: {woodprefix}e^
+disablewood: {woodprefix}d^
+
+sheetprefix: s{Down 16}
+enablesheet: {sheetprefix}e^
+disablesheet: {sheetprefix}d^
+
+
+##################################
+# farm plots
+##################################
+
+# Sets a farm plot to grow the LAST type of seed in the list of available seeds
+# for all 4 seasons. The last seed is used because it's usually Plump helmet
+# spawn, suitable for post-embark. If you only have 1 seed type, that'll be
+# grown.
+growlastcropall: a/&b/&c/&d/&
+
+# Like growlastcropall but grows the first one in the list instead.
+growfirstcropall: a&b&c&d&
diff --git a/depends/CMakeLists.txt b/depends/CMakeLists.txt
index aac250c39..3d7e18da7 100644
--- a/depends/CMakeLists.txt
+++ b/depends/CMakeLists.txt
@@ -17,3 +17,48 @@ option(CLSOCKET_SHARED "Build clsocket lib as shared." OFF)
option(CLSOCKET_DEP_ONLY "Build for use inside other CMake projects as dependency." ON)
add_subdirectory(clsocket)
ide_folder(clsocket "Depends")
+
+# set the default values of libexpat options - the descriptions are left empty
+# because later option() calls *do* override those
+set(EXPAT_BUILD_EXAMPLES OFF CACHE BOOL "")
+set(EXPAT_BUILD_TESTS OFF CACHE BOOL "")
+set(EXPAT_BUILD_TOOLS OFF CACHE BOOL "")
+set(EXPAT_SHARED_LIBS OFF CACHE BOOL "")
+set(EXPAT_BUILD_DOCS OFF CACHE BOOL "")
+set(EXPAT_ENABLE_INSTALL OFF CACHE BOOL "")
+add_subdirectory(libexpat/expat)
+
+set(LIBZIP_BUILD_DOC OFF CACHE BOOL "")
+set(LIBZIP_BUILD_EXAMPLES OFF CACHE BOOL "")
+set(LIBZIP_BUILD_REGRESS OFF CACHE BOOL "")
+set(LIBZIP_BUILD_SHARED_LIBS OFF CACHE BOOL "")
+set(LIBZIP_BUILD_TOOLS OFF CACHE BOOL "")
+set(LIBZIP_ENABLE_BZIP2 OFF CACHE BOOL "")
+set(LIBZIP_ENABLE_COMMONCRYPTO OFF CACHE BOOL "")
+set(LIBZIP_ENABLE_GNUTLS OFF CACHE BOOL "")
+set(LIBZIP_ENABLE_LZMA OFF CACHE BOOL "")
+set(LIBZIP_ENABLE_MBEDTLS OFF CACHE BOOL "")
+set(LIBZIP_ENABLE_OPENSSL OFF CACHE BOOL "")
+set(LIBZIP_ENABLE_WINDOWS_CRYPTO OFF CACHE BOOL "")
+set(LIBZIP_DO_INSTALL OFF CACHE BOOL "")
+add_subdirectory(libzip)
+if(MSVC)
+ target_compile_options(zip PRIVATE /wd4244)
+endif()
+
+set(XLSXIO_USE_DFHACK_LIBS ON CACHE BOOL "")
+set(XLSXIO_BUILD_STATIC ON CACHE BOOL "")
+set(XLSXIO_BUILD_SHARED OFF CACHE BOOL "")
+set(XLSXIO_BUILD_DOCUMENTATION OFF CACHE BOOL "")
+set(XLSXIO_BUILD_EXAMPLES OFF CACHE BOOL "")
+set(XLSXIO_BUILD_TOOLS OFF CACHE BOOL "")
+set(XLSXIO_WITH_LIBZIP ON CACHE BOOL "")
+set(XLSXIO_ZLIB_DIR "${ZLIB_DIR}" CACHE PATH "")
+set(XLSXIO_LIBZIP_DIR "${CMAKE_CURRENT_BINARY_DIR}/libzip" CACHE PATH "")
+set(XLSXIO_EXPAT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/libexpat" CACHE PATH "")
+set(XLSXIO_ENABLE_INSTALL OFF CACHE BOOL "")
+add_subdirectory(xlsxio)
+if(MSVC)
+ target_compile_options(xlsxio_read_STATIC PRIVATE /wd4013 /wd4244)
+ target_compile_options(xlsxio_write_STATIC PRIVATE /wd4013 /wd4244)
+endif()
diff --git a/depends/libexpat b/depends/libexpat
new file mode 160000
index 000000000..3c0f2e86c
--- /dev/null
+++ b/depends/libexpat
@@ -0,0 +1 @@
+Subproject commit 3c0f2e86ce4e7a3a3b30e765087d02a68bba7e6f
diff --git a/depends/libzip b/depends/libzip
new file mode 160000
index 000000000..be76fa508
--- /dev/null
+++ b/depends/libzip
@@ -0,0 +1 @@
+Subproject commit be76fa5086bfe6b1a5e83c9855e39f98edc1f066
diff --git a/depends/protobuf/google/protobuf/message.cc b/depends/protobuf/google/protobuf/message.cc
index 91e6878e8..37db6a485 100644
--- a/depends/protobuf/google/protobuf/message.cc
+++ b/depends/protobuf/google/protobuf/message.cc
@@ -32,6 +32,7 @@
// Based on original Protocol Buffers design by
// Sanjay Ghemawat, Jeff Dean, and others.
+#include
#include
#include
diff --git a/depends/tthread/CMakeLists.txt b/depends/tthread/CMakeLists.txt
index 9e0e85dc5..dfb1d9901 100644
--- a/depends/tthread/CMakeLists.txt
+++ b/depends/tthread/CMakeLists.txt
@@ -1,5 +1,5 @@
project(dfhack-tinythread)
-add_library(dfhack-tinythread STATIC EXCLUDE_FROM_ALL tinythread.cpp tinythread.h fast_mutex.h)
+add_library(dfhack-tinythread STATIC EXCLUDE_FROM_ALL tinythread.cpp tinythread.h)
if(UNIX)
target_link_libraries(dfhack-tinythread pthread)
endif()
diff --git a/depends/tthread/fast_mutex.h b/depends/tthread/fast_mutex.h
deleted file mode 100644
index a381b2c75..000000000
--- a/depends/tthread/fast_mutex.h
+++ /dev/null
@@ -1,249 +0,0 @@
-/* -*- mode: c++; tab-width: 2; indent-tabs-mode: nil; -*-
-Copyright (c) 2010-2012 Marcus Geelnard
-
-This software is provided 'as-is', without any express or implied
-warranty. In no event will the authors be held liable for any damages
-arising from the use of this software.
-
-Permission is granted to anyone to use this software for any purpose,
-including commercial applications, and to alter it and redistribute it
-freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
-
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
-
- 3. This notice may not be removed or altered from any source
- distribution.
-*/
-
-#ifndef _FAST_MUTEX_H_
-#define _FAST_MUTEX_H_
-
-/// @file
-
-// Which platform are we on?
-#if !defined(_TTHREAD_PLATFORM_DEFINED_)
- #if defined(_WIN32) || defined(__WIN32__) || defined(__WINDOWS__)
- #define _TTHREAD_WIN32_
- #else
- #define _TTHREAD_POSIX_
- #endif
- #define _TTHREAD_PLATFORM_DEFINED_
-#endif
-
-// Check if we can support the assembly language level implementation (otherwise
-// revert to the system API)
-#if (defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))) || \
- (defined(_MSC_VER) && (defined(_M_IX86) /*|| defined(_M_X64)*/)) || \
- (defined(__GNUC__) && (defined(__ppc__)))
- #define _FAST_MUTEX_ASM_
-#else
- #define _FAST_MUTEX_SYS_
-#endif
-
-#if defined(_TTHREAD_WIN32_)
- #define NOMINMAX
- #ifndef WIN32_LEAN_AND_MEAN
- #define WIN32_LEAN_AND_MEAN
- #define __UNDEF_LEAN_AND_MEAN
- #endif
- #include
- #ifdef __UNDEF_LEAN_AND_MEAN
- #undef WIN32_LEAN_AND_MEAN
- #undef __UNDEF_LEAN_AND_MEAN
- #endif
-#else
- #ifdef _FAST_MUTEX_ASM_
- #include
- #else
- #include
- #endif
-#endif
-
-namespace tthread {
-
-/// Fast mutex class.
-/// This is a mutual exclusion object for synchronizing access to shared
-/// memory areas for several threads. It is similar to the tthread::mutex class,
-/// but instead of using system level functions, it is implemented as an atomic
-/// spin lock with very low CPU overhead.
-///
-/// The \c fast_mutex class is NOT compatible with the \c condition_variable
-/// class (however, it IS compatible with the \c lock_guard class). It should
-/// also be noted that the \c fast_mutex class typically does not provide
-/// as accurate thread scheduling as a the standard \c mutex class does.
-///
-/// Because of the limitations of the class, it should only be used in
-/// situations where the mutex needs to be locked/unlocked very frequently.
-///
-/// @note The "fast" version of this class relies on inline assembler language,
-/// which is currently only supported for 32/64-bit Intel x86/AMD64 and
-/// PowerPC architectures on a limited number of compilers (GNU g++ and MS
-/// Visual C++).
-/// For other architectures/compilers, system functions are used instead.
-class fast_mutex {
- public:
- /// Constructor.
-#if defined(_FAST_MUTEX_ASM_)
- fast_mutex() : mLock(0) {}
-#else
- fast_mutex()
- {
- #if defined(_TTHREAD_WIN32_)
- InitializeCriticalSection(&mHandle);
- #elif defined(_TTHREAD_POSIX_)
- pthread_mutex_init(&mHandle, NULL);
- #endif
- }
-#endif
-
-#if !defined(_FAST_MUTEX_ASM_)
- /// Destructor.
- ~fast_mutex()
- {
- #if defined(_TTHREAD_WIN32_)
- DeleteCriticalSection(&mHandle);
- #elif defined(_TTHREAD_POSIX_)
- pthread_mutex_destroy(&mHandle);
- #endif
- }
-#endif
-
- /// Lock the mutex.
- /// The method will block the calling thread until a lock on the mutex can
- /// be obtained. The mutex remains locked until \c unlock() is called.
- /// @see lock_guard
- inline void lock()
- {
-#if defined(_FAST_MUTEX_ASM_)
- bool gotLock;
- do {
- gotLock = try_lock();
- if(!gotLock)
- {
- #if defined(_TTHREAD_WIN32_)
- Sleep(0);
- #elif defined(_TTHREAD_POSIX_)
- sched_yield();
- #endif
- }
- } while(!gotLock);
-#else
- #if defined(_TTHREAD_WIN32_)
- EnterCriticalSection(&mHandle);
- #elif defined(_TTHREAD_POSIX_)
- pthread_mutex_lock(&mHandle);
- #endif
-#endif
- }
-
- /// Try to lock the mutex.
- /// The method will try to lock the mutex. If it fails, the function will
- /// return immediately (non-blocking).
- /// @return \c true if the lock was acquired, or \c false if the lock could
- /// not be acquired.
- inline bool try_lock()
- {
-#if defined(_FAST_MUTEX_ASM_)
- int oldLock;
- #if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
- asm volatile (
- "movl $1,%%eax\n\t"
- "xchg %%eax,%0\n\t"
- "movl %%eax,%1\n\t"
- : "=m" (mLock), "=m" (oldLock)
- :
- : "%eax", "memory"
- );
- #elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))
- int *ptrLock = &mLock;
- __asm {
- mov eax,1
- mov ecx,ptrLock
- xchg eax,[ecx]
- mov oldLock,eax
- }
- #elif defined(__GNUC__) && (defined(__ppc__))
- int newLock = 1;
- asm volatile (
- "\n1:\n\t"
- "lwarx %0,0,%1\n\t"
- "cmpwi 0,%0,0\n\t"
- "bne- 2f\n\t"
- "stwcx. %2,0,%1\n\t"
- "bne- 1b\n\t"
- "isync\n"
- "2:\n\t"
- : "=&r" (oldLock)
- : "r" (&mLock), "r" (newLock)
- : "cr0", "memory"
- );
- #endif
- return (oldLock == 0);
-#else
- #if defined(_TTHREAD_WIN32_)
- return TryEnterCriticalSection(&mHandle) ? true : false;
- #elif defined(_TTHREAD_POSIX_)
- return (pthread_mutex_trylock(&mHandle) == 0) ? true : false;
- #endif
-#endif
- }
-
- /// Unlock the mutex.
- /// If any threads are waiting for the lock on this mutex, one of them will
- /// be unblocked.
- inline void unlock()
- {
-#if defined(_FAST_MUTEX_ASM_)
- #if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
- asm volatile (
- "movl $0,%%eax\n\t"
- "xchg %%eax,%0\n\t"
- : "=m" (mLock)
- :
- : "%eax", "memory"
- );
- #elif defined(_MSC_VER) && (defined(_M_IX86) || defined(_M_X64))
- int *ptrLock = &mLock;
- __asm {
- mov eax,0
- mov ecx,ptrLock
- xchg eax,[ecx]
- }
- #elif defined(__GNUC__) && (defined(__ppc__))
- asm volatile (
- "sync\n\t" // Replace with lwsync where possible?
- : : : "memory"
- );
- mLock = 0;
- #endif
-#else
- #if defined(_TTHREAD_WIN32_)
- LeaveCriticalSection(&mHandle);
- #elif defined(_TTHREAD_POSIX_)
- pthread_mutex_unlock(&mHandle);
- #endif
-#endif
- }
-
- private:
-#if defined(_FAST_MUTEX_ASM_)
- int mLock;
-#else
- #if defined(_TTHREAD_WIN32_)
- CRITICAL_SECTION mHandle;
- #elif defined(_TTHREAD_POSIX_)
- pthread_mutex_t mHandle;
- #endif
-#endif
-};
-
-}
-
-#endif // _FAST_MUTEX_H_
-
diff --git a/depends/tthread/tinythread.h b/depends/tthread/tinythread.h
index d575bae33..b5ff2f077 100644
--- a/depends/tthread/tinythread.h
+++ b/depends/tthread/tinythread.h
@@ -46,7 +46,6 @@ freely, subject to the following restrictions:
/// @li tthread::recursive_mutex
/// @li tthread::condition_variable
/// @li tthread::lock_guard
-/// @li tthread::fast_mutex
///
/// @section misc_sec Miscellaneous
/// The following special keywords are available: #thread_local.
diff --git a/depends/xlsxio b/depends/xlsxio
new file mode 160000
index 000000000..4056226fe
--- /dev/null
+++ b/depends/xlsxio
@@ -0,0 +1 @@
+Subproject commit 4056226fe0df6bff4593ee2353cca07c2b7f327e
diff --git a/dfhack-config/quickfort/aliases.txt b/dfhack-config/quickfort/aliases.txt
new file mode 100644
index 000000000..1d1ebff9f
--- /dev/null
+++ b/dfhack-config/quickfort/aliases.txt
@@ -0,0 +1,106 @@
+# Aliases for quickfort #query mode blueprints
+#
+# This file defines custom keycode shortcuts for #query mode blueprints.
+# Definitions in this file take precedence over any definitions in the baseline
+# aliases configuration file at hack/data/quickfort/aliases-common.txt. See that
+# file for the many useful aliases that are already defined.
+#
+# If possible, build on the baseline aliases when defining your own aliases. If
+# the DF UI screens change, updated baseline aliases may allow your aliases to
+# automatically adapt to the new UI. For example, if you create an alias to
+# modify particular furniture stockpile settings, start your alias with
+# "{furnitureprefix}" instead of manually writing "s{Down 2}". Then, if the
+# location of the furniture setting changes, your alias will automatically
+# inherit the updated position when DFHack is updated.
+#
+# Aliases simplify repetitive tasks, such as configuring workshop profiles or
+# adjusting a food stockpile to accept only seeds. Making new aliases is just a
+# matter of mimicking the keys used to navigate through the menus and select
+# options. Use the aliases in your blueprint spreadsheets by writing an alias by
+# itself in a cell, like "nocontainers", or reference an alias in a larger
+# sequence by enclosing it in curly brackets, like "{nocontainers}{linksonly}"
+#
+# For example, say you have the following build and place blueprints:
+#
+# #build masonry workshop
+# ~, ~,~,`,`,`
+# ~,wm,~,`,`,`
+# ~, ~,~,`,`,`
+#
+# #place stockpile for mason
+# ~,~,~,s,s,s
+# ~,~,~,s,s,s
+# ~,~,~,s,s,s
+#
+# and you want to configure the stockpile to hold only non-economic ("other")
+# stone and to give to the adjacent mason workshop. You could write the
+# keystrokes directly:
+#
+# #query start(4;1;upper left corner of stockpile) configure mason
+# ~,~,~,s{Down 5}deb{Right}{Down 2}p^,`,`
+# ~,~,~,g{Left 2}&, `,`
+# ~,~,~,`, `,`
+#
+# or you could use alias names:
+#
+# #query start(4;1;upper left corner of stockpile) configure mason
+# ~,~,~,otherstone,`,`
+# ~,~,~,give2left, `,`
+# ~,~,~,`, `,`
+#
+# you can combine the two aliases above into a single cell as well, if desired:
+#
+# #query start(4;1;upper left corner of stockpile) configure mason
+# ~,~,~,{otherstone}{give2left},`,`
+# ~,~,~,`, `,`
+# ~,~,~,`, `,`
+#
+# The syntax for defining aliases is:
+# aliasname: keystrokes
+#
+# Where aliasname is at least two letters or digits long (including dashes and
+# underscores) and keystrokes are whatever you would type into the DF UI. A
+# keystroke can also be a named keycode from the DF interface definition file
+# (data/init/interface.txt), enclosed in curly brackets like an alias, like:
+# "{Right}" or "{Enter}". In # order to avoid naming conflicts between aliases
+# and keycodes, the convention is to start aliases with a lowercase letter.
+#
+# Anything enclosed within curly brackets can also have a number after it,
+# indicating how many times that alias or keycode should be repeated. For
+# example: "{togglesequence 9}" or "{Down 5}".
+#
+# Finally, you can specify sub-aliases that will only be defined while the
+# current alias is being resolved by adding them after the alias name (but
+# before the repetition number, if it is specified), for example:
+# {quantumstopfromeast name="Trash Dump"}
+# The value of the sub-alias 'name' is used by quantumstopfromeast (or one of
+# the aliases it calls) to give a useful name to your quantum dump hauling
+# route. You can also use this format to temporarily override the value of an
+# existing regularly-defined alias.
+#
+# Sub-aliases must be in one of the following formats:
+# subaliasname=valwithnospaces
+# subaliasname="val with spaces"
+# subaliasname={someotheralias repetitions}
+#
+# Ctrl, Alt, and Shift modifiers can be specified for the next keycode by adding
+# them into the key sequence. For example, Alt-h is written as "{Alt}h".
+#
+# Some frequently-used keystrokes are assigned shorthand characters. Think of
+# them as single-character aliases that don't need to be surrounded in curly
+# brackets:
+# & expands to {Enter}
+# @ expands to {Shift}{Enter}
+# ~ expands to {Alt}
+# ! expands to {Ctrl}
+# ^ expands to {ESC}
+#
+# There is also a non-standard alias built into the code for the common
+# shorthand for "make room":
+# r+ expands to r+&
+#
+# If you need literal verisons of the shorthand characters, surround them in
+# curly brackets, for example: "{!}"
+#
+#
+# Add your custom aliases here:
diff --git a/dfhack-config/quickfort/quickfort.txt b/dfhack-config/quickfort/quickfort.txt
new file mode 100644
index 000000000..3a57bfbaf
--- /dev/null
+++ b/dfhack-config/quickfort/quickfort.txt
@@ -0,0 +1,37 @@
+# quickfort main configuration file
+#
+# Set startup defaults for the quickfort script in this file. Settings can be
+# temporarily overridden in the active session with the `quickfort set` command.
+#
+# If you have edited this file but want to revert to "factory defaults", delete
+# this file and a fresh one will be copied from
+# dfhack-config/default/quickfort/quickfort.txt the next time you start DFHack.
+
+# Directory tree to search for blueprints. Can be set to an absolute or relative
+# path. If set to a relative path, resolves to a directory under the DF folder.
+# Note that if you change this directory, you will not automatically pick up
+# blueprints written by the DFHack "blueprint" plugin (which always writes to
+# the "blueprints" dir).
+blueprints_dir=blueprints
+
+# Set to "true" or "false". If true, will designate all dig blueprints in marker
+# mode. If false, only cells with dig codes explicitly prefixed with an "m" will
+# be designated in marker mode.
+force_marker_mode=false
+
+# Skip query blueprint sanity checks that detect common blueprint errors and
+# halt or skip keycode playback. Checks include ensuring a configurable building
+# exists at the designated cursor position and verifying the active UI screen is
+# the same before and after sending keys for the cursor position. Temporarily
+# enable this if you are running a query blueprint that sends a key sequence
+# that is *not* related to stockpile or building configuration.
+query_unsafe=false
+
+# Set to the maximum number of resources you want assigned to stockpiles of the
+# relevant types. Set to -1 for DF defaults (number of stockpile tiles for
+# stockpiles that take barrels and bins, 1 wheelbarrow for stone stockpiles).
+# The default here for wheelbarrows is 0 since using wheelbarrows normally
+# *decreases* the efficiency of your fort.
+stockpiles_max_barrels=-1
+stockpiles_max_bins=-1
+stockpiles_max_wheelbarrows=0
diff --git a/dfhack.init-example b/dfhack.init-example
index d8cf832c7..0fd445fff 100644
--- a/dfhack.init-example
+++ b/dfhack.init-example
@@ -245,6 +245,7 @@ enable \
dwarfmonitor \
mousequery \
autogems \
+ autodump \
automelt \
autotrade \
buildingplan \
diff --git a/docs/Authors.rst b/docs/Authors.rst
index 72d61de06..e3478e486 100644
--- a/docs/Authors.rst
+++ b/docs/Authors.rst
@@ -25,6 +25,7 @@ belal jimhester
Ben Lubar BenLubar
Ben Rosser TC01
billw2012 billw2012
+BrickViking brickviking
brndd brndd burneddi
Bumber Bumber64
Caldfir caldfir
@@ -32,6 +33,7 @@ Carter Bray Qartar
Chris Dombroski cdombroski
Clayton Hughes
Clément Vuchener cvuchener
+daedsidog daedsidog
Dan Amlund danamlund
Daniel Brooks db48x
David Nilsolm
@@ -42,6 +44,7 @@ Deon
DoctorVanGogh DoctorVanGogh
Donald Ruegsegger hashaash
doomchild doomchild
+ElMendukol ElMendukol
enjia2000
Eric Wald eswald
Erik Youngren Artanis
@@ -50,14 +53,15 @@ expwnent expwnent
Feng
figment figment
gchristopher gchristopher
+George Murray GitOnUp
grubsteak grubsteak
Harlan Playford playfordh
Hayati Ayguen hayguen
Herwig Hochleitner bendlas
Ian S kremlin-
IndigoFenix
+James Gilles kazimuth
James Logsdon jlogsdon
-Japa JapaMala
Jared Adams
Jeremy Apthorp nornagon
Jim Lisi stonetoad
@@ -73,6 +77,7 @@ kane-t kane-t
Kelly Kinkade ab9rf
KlonZK KlonZK
Kris Parker kaypy
+Kristjan Moore kristjanmoore
Kromtec Kromtec
Kurik Amudnil
Lethosor lethosor
@@ -98,6 +103,7 @@ Milo Christiansen milochristiansen
MithrilTuxedo MithrilTuxedo
mizipzor mizipzor
moversti moversti
+Myk Taylor myk002
napagokc napagokc
Neil Little nmlittle
Nick Rart nickrart comestible
@@ -106,6 +112,8 @@ Nikolay Amiantov abbradar
nocico nocico
Omniclasm
OwnageIsMagic OwnageIsMagic
+palenerd dlmarquis
+PassionateAngler PassionateAngler
Patrik Lundell PatrikLundell
Paul Fenwick pjf
PeridexisErrant PeridexisErrant
@@ -117,6 +125,7 @@ Priit Laes plaes
Putnam Putnam3145
Quietust quietust _Q
Raidau Raidau
+Ralph Bisschops ralpha
Ramblurr Ramblurr
rampaging-poet
Raoul van Putten
@@ -127,15 +136,18 @@ Rinin Rinin
rndmvar rndmvar
Robert Heinrich rh73
Robert Janetzko robertjanetzko
+Rocco Moretti roccomoretti
RocheLimit
rofl0r rofl0r
root
+Rose RosaryMala
Roses Pheosics
Ross M RossM
rout
rubybrowncoat rubybrowncoat
Rumrusher rumrusher
RusAnon RusAnon
+Ryan Bennitt ryanbennitt
sami
scamtank scamtank
Sebastian Wolfertz Enkrod
@@ -158,6 +170,7 @@ Timothy Collett danaris
Timur Kelman TymurGubayev
Tom Jobbins TheBloke
Tom Prince
+Tommy R tommy
TotallyGatsby TotallyGatsby
Travis Hoppe thoppe orthographic-pedant
txtsd txtsd
@@ -165,7 +178,7 @@ U-glouglou\\simon
Valentin Ochs Cat-Ion
Vitaly Pronkin pronvit mifki
ViTuRaS ViTuRaS
-Vjek
+Vjek vjek
Warmist warmist
Wes Malone wesQ3
Will Rogers wjrogers
diff --git a/docs/Binpatches.rst b/docs/Binpatches.rst
index a0fcc6630..8af50fa45 100644
--- a/docs/Binpatches.rst
+++ b/docs/Binpatches.rst
@@ -15,7 +15,8 @@ the `binpatch` command.
at all possible - that way your work will work for many versions
across multiple operating systems.
-.. contents::
+.. contents:: Contents
+ :local:
Getting a patch
@@ -24,7 +25,7 @@ There are no binary patches available for Dwarf Fortress versions after 0.34.11.
This system is kept for the chance that someone will find it useful, so some
hints on how to write your own follow. This will require disassembly and
-decent skill in `memory research `.
+decent skill in `memory research `.
* The patches are expected to be encoded in text format used by IDA.
@@ -79,7 +80,9 @@ system console:
If you use a permanent patch under OSX or Linux, you must update
``symbols.xml`` with the new checksum of the executable. Find the relevant
-section, and add a new line::
+section, and add a new line:
+
+.. code-block:: xml
diff --git a/docs/Compile.rst b/docs/Compile.rst
index f30775a03..7e2709e74 100644
--- a/docs/Compile.rst
+++ b/docs/Compile.rst
@@ -1,48 +1,84 @@
+.. highlight:: shell
+
+.. _compile:
+
################
Compiling DFHack
################
-You don't need to compile DFHack unless you're developing plugins or working on the core.
+DFHack builds are available for all supported platforms; see `installing` for
+installation instructions. If you are a DFHack end-user, modder, or plan on
+writing scripts (not plugins), it is generally recommended (and easier) to use
+these builds instead of compiling DFHack from source.
-For users, modders, and authors of scripts it's better to download
-and `install the latest release instead `.
+However, if you are looking to develop plugins, work on the DFHack core, make
+complex changes to DF-structures, or anything else that requires compiling
+DFHack from source, this document will walk you through the build process. Note
+that some steps may be unconventional compared to other projects, so be sure to
+pay close attention if this is your first time compiling DFHack.
-.. contents::
- :depth: 2
+.. contents:: Contents
+ :local:
+ :depth: 1
.. _compile-how-to-get-the-code:
How to get the code
===================
-DFHack doesn't have any kind of system of code snapshots in place, so you will have to
-get code from the GitHub repository using Git. How to get Git is described under
-the instructions for each platform.
-
-To get the latest release code (master branch)::
+DFHack uses Git for source control; instructions for installing Git can be found
+in the platform-specific sections below. The code is hosted on
+`GitHub `_, and can be downloaded with::
git clone --recursive https://github.com/DFHack/dfhack
cd dfhack
-If your version of Git does not support the ``--recursive`` flag, you will need to omit it and run
-``git submodule update --init`` after entering the dfhack directory.
+If your version of Git does not support the ``--recursive`` flag, you will need
+to omit it and run ``git submodule update --init`` after entering the dfhack
+directory.
-To get the latest development code (develop branch), clone as above and then::
+This will check out the code on the default branch of the GitHub repo, currently
+``develop``, which may be unstable. If you want code for the latest stable
+release, you can check out the ``master`` branch instead::
- git checkout develop
+ git checkout master
git submodule update
-Generally, you should only need to clone DFHack once.
-
-**Important note regarding submodule update after pulling or changing branches**:
-
-You must run ``git submodule update`` every time you change branches, such as
-when switching between the master and develop branches or vice versa. You also
-must run it after pulling any changes to submodules from the DFHack repo. If a
-submodule only exists on the newer branch, or if a commit you just pulled
-contains a new submodule, you need to run ``git submodule update --init``.
-Failure to do this may result in a variety of errors, including ``fatal:
-does not exist`` when using Git, errors when building DFHack, and ``not a known
-DF version`` when starting DF.
+In general, a single DFHack clone is suitable for development - most Git
+operations such as switching branches can be done on an existing clone. If you
+find yourself cloning DFHack frequently as part of your development process, or
+getting stuck on anything else Git-related, feel free to reach out to us for
+assistance.
+
+.. admonition:: A note on submodules
+
+ DFHack uses submodules extensively to manage its subprojects (including the
+ ``scripts`` folder and DF-structures in ``library/xml``). Failing to keep
+ submodules in sync when switching between branches can result in build errors
+ or scripts that don't work. In general, you should always update submodules
+ whenever you switch between branches in the main DFHack repo with
+ ``git submodule update``. (If you are working on bleeding-edge DFHack and
+ have checked out the master branch of some submodules, running ``git pull``
+ in those submodules is also an option.)
+
+ Rarely, we add or remove submodules. If there are any changes to the existence
+ of submodules when you switch between branches, you should run
+ ``git submodule update --init`` instead (adding ``--init`` to the above
+ command).
+
+ Some common errors that can arise when failing to update submodules include:
+
+ * ``fatal: does not exist`` when performing Git operations
+ * Build errors, particularly referring to structures in the ``df::`` namespace
+ or the ``library/include/df`` folder
+ * ``Not a known DF version`` when starting DF
+ * ``Run 'git submodule update --init'`` when running CMake
+
+ Submodules are a particularly confusing feature of Git. The
+ `Git Book `_ has a
+ thorough explanation of them (as well as of many other aspects of Git) and
+ is a recommended resource if you run into any issues. Other DFHack developers
+ are also able to help with any submodule-related (or Git-related) issues
+ you may encounter.
**More notes**:
@@ -51,18 +87,21 @@ DF version`` when starting DF.
Contributing to DFHack
======================
-If you want to get involved with the development, create an account on
-GitHub, make a clone there and then use that as your remote repository instead.
-
-We'd love that; join us on IRC_ (#dfhack channel on freenode) for discussion,
-and whenever you need help.
+To contribute to DFHack on GitHub, you will need a GitHub account. Only some
+DFHack developers can push directly to the DFHack repositories; we recommend
+making a fork of whatever repos you are interested in contributing to, making
+changes there, and submitting pull requests. `GitHub's pull request tutorial
+`_
+is a good resource for getting started with pull requests (some things to note:
+our work mainly happens on the ``develop`` branch, and you will need to use
+your own fork, assuming that you don't have write access to the DFHack repos).
-.. _IRC: https://webchat.freenode.net/?channels=dfhack
+Most development-related discussion happens on IRC or in individual GitHub
+issues and pull requests, but there are also other ways to reach out - see
+`support` for details.
-(Note: for submodule issues, please see the above instructions first!)
-
-For lots more details on contributing to DFHack, including pull requests, code format,
-and more, please see `contributing-code`.
+For more details on contributing to DFHack, including pull requests, code
+format, and more, please see `contributing-code`.
Build settings
@@ -75,10 +114,11 @@ in the platform-specific sections below first, then come back here.
Generator
---------
-The ``Ninja`` CMake build generator is the prefered build method on Linux and
+The ``Ninja`` CMake build generator is the preferred build method on Linux and
macOS, instead of ``Unix Makefiles``, which is the default. You can select Ninja
by passing ``-G Ninja`` to CMake. Incremental builds using Unix Makefiles can be
-much slower than Ninja builds.
+much slower than Ninja builds. Note that you will probably need to install
+Ninja; see the platform-specific sections for details.
::
@@ -126,6 +166,8 @@ in any case.
Note that the scripts in the "build" folder on Windows will set the architecture
automatically.
+.. _compile-build-options:
+
Other settings
--------------
There are a variety of other settings which you can find in CMakeCache.txt in
@@ -133,6 +175,9 @@ your build folder or by running ``ccmake`` (or another CMake GUI). Most
DFHack-specific settings begin with ``BUILD_`` and control which parts of DFHack
are built.
+
+.. _compile-linux:
+
Linux
=====
On Linux, DFHack acts as a library that shadows parts of the SDL API using LD_PRELOAD.
@@ -144,13 +189,18 @@ DFHack is meant to be installed into an existing DF folder, so get one ready.
We assume that any Linux platform will have ``git`` available (though it may
need to be installed with your package manager.)
-To build DFHack you need GCC version 4.8 or later. GCC 4.8 is easiest to work
-with due to avoiding libstdc++ issues (see below), but any version from 4.8
-onwards (including 5.x) will work.
+To build DFHack, you need GCC 4.8 or newer. GCC 4.8 has the benefit of avoiding
+`libstdc++ compatibility issues `, but can be hard
+to obtain on modern distributions, and working around these issues is done
+automatically by the ``dfhack`` launcher script. As long as your system-provided
+GCC is new enough, it should work. Note that extremely new GCC versions may not
+have been used to build DFHack yet, so if you run into issues with these, please
+let us know (e.g. by opening a GitHub issue).
Before you can build anything, you'll also need ``cmake``. It is advisable to
also get ``ccmake`` on distributions that split the cmake package into multiple
-parts.
+parts. As mentioned above, ``ninja`` is recommended (many distributions call
+this package ``ninja-build``).
You will need pthread; most systems should have this already. Note that older
CMake versions may have trouble detecting pthread, so if you run into
@@ -226,37 +276,44 @@ This will show a curses-based interface that lets you set all of the
extra options. You can also use a cmake-friendly IDE like KDevelop 4
or the cmake-gui program.
+.. _linux-incompatible-libstdcxx:
+
Incompatible libstdc++
~~~~~~~~~~~~~~~~~~~~~~
-When compiling dfhack yourself, it builds against your system libstdc++. When
-Dwarf Fortress runs, it uses a libstdc++ shipped with the binary, which comes
-from GCC 4.8 and is incompatible with code compiled with newer GCC versions. If
-you compile DFHack with a GCC version newer than 4.8, you will see an error
-message such as::
+When compiling DFHack yourself, it builds against your system libstdc++. When
+Dwarf Fortress runs, it uses a libstdc++ shipped in the ``libs`` folder, which
+comes from GCC 4.8 and is incompatible with code compiled with newer GCC
+versions. As of DFHack 0.42.05-alpha1, the ``dfhack`` launcher script attempts
+to fix this by automatically removing the DF-provided libstdc++ on startup.
+In rare cases, this may fail and cause errors such as:
+
+.. code-block:: text
./libs/Dwarf_Fortress: /pathToDF/libs/libstdc++.so.6: version
`GLIBCXX_3.4.18' not found (required by ./hack/libdfhack.so)
-To fix this you can compile with GCC 4.8 or remove the libstdc++ shipped with
+The easiest way to fix this is generally removing the libstdc++ shipped with
DF, which causes DF to use your system libstdc++ instead::
cd /path/to/DF/
rm libs/libstdc++.so.6
-Note that distributing binaries compiled with newer GCC versions requires end-
-users to delete libstdc++ themselves and have a libstdc++ on their system from
-the same GCC version or newer. For this reason, distributing anything compiled
-with GCC versions newer than 4.8 is discouraged. In the future we may start
-bundling a later libstdc++ as part of the DFHack package, so as to enable
-compilation-for-distribution with a GCC newer than 4.8.
-
-Mac OS X
-========
-DFHack functions similarly on OS X and Linux, and the majority of the
-information above regarding the build process (cmake and ninja) applies here
+Note that distributing binaries compiled with newer GCC versions may result in
+the opposite compatibily issue: users with *older* GCC versions may encounter
+similar errors. This is why DFHack distributes both GCC 4.8 and GCC 7 builds. If
+you are planning on distributing binaries to other users, we recommend using an
+older GCC (but still at least 4.8) version if possible.
+
+
+.. _compile-macos:
+
+macOS
+=====
+DFHack functions similarly on macOS and Linux, and the majority of the
+information above regarding the build process (CMake and Ninja) applies here
as well.
-DFHack can officially be built on OS X with GCC 4.8 or 7. Anything newer than 7
+DFHack can officially be built on macOS only with GCC 4.8 or 7. Anything newer than 7
will require you to perform extra steps to get DFHack to run (see `osx-new-gcc-notes`),
and your build will likely not be redistributable.
@@ -309,9 +366,9 @@ Dependencies and system set-up
cleaner, quicker, and smarter. For example, installing MacPort's GCC will
install more than twice as many dependencies as Homebrew's will, and all in
both 32-bit and 64-bit variants. Homebrew also doesn't require constant use
- of sudo.
+ of ``sudo``.
- Using `Homebrew `_ (recommended)::
+ Using `Homebrew `_ (recommended)::
brew tap homebrew/versions
brew install git
@@ -346,14 +403,14 @@ Dependencies and system set-up
* In a separate, local Perl install
Rather than using system Perl, you might also want to consider
- the Perl manager, `Perlbrew `_.
+ the Perl manager, `Perlbrew `_.
This manages Perl 5 locally under ``~/perl5/``, providing an easy
way to install Perl and run CPAN against it without ``sudo``.
It can maintain multiple Perl installs and being local has the
benefit of easy migration and insulation from OS issues and upgrades.
- See http://perlbrew.pl/ for more details.
+ See https://perlbrew.pl/ for more details.
Building
--------
@@ -378,9 +435,9 @@ Building
export CC=gcc-7
export CXX=g++-7
- etc.
+ (adjust as needed for different GCC installations)
-* Build dfhack::
+* Build DFHack::
mkdir build-osx
cd build-osx
@@ -390,6 +447,7 @@ Building
should be a path to a copy of Dwarf Fortress, of the appropriate
version for the DFHack you are building.
+
.. _compile-windows:
Windows
@@ -463,7 +521,7 @@ To install Chocolatey and the required dependencies:
You can now use all of these utilities from any normal ``cmd.exe`` window.
You only need Admin/elevated ``cmd.exe`` for running ``choco install`` commands;
for all other purposes, including compiling DFHack, you should use
-a normal ``cmd.exe`` (or, better, an improved terminal like `Cmder `_;
+a normal ``cmd.exe`` (or, better, an improved terminal like `Cmder `_;
details below, under Build.)
**NOTE**: you can run the above ``choco install`` command even if you already have
@@ -490,29 +548,31 @@ Some examples:
CMake
^^^^^
You can get the win32 installer version from
-`the official site `_.
+`the official site `_.
It has the usual installer wizard. Make sure you let it add its binary folder
to your binary search PATH so the tool can be later run from anywhere.
Perl / Strawberry Perl
^^^^^^^^^^^^^^^^^^^^^^
-For the code generation parts you'll need Perl 5 with XML::LibXML and XML::LibXSLT.
-`Strawberry Perl `_ is recommended as it includes
-all of the required packages in a single, easy install.
+For the code generation stage of the build process, you'll need Perl 5 with
+XML::LibXML and XML::LibXSLT. `Strawberry Perl `_ is
+recommended as it includes all of the required packages in a single, easy
+install.
After install, ensure Perl is in your user's PATH. This can be edited from
``Control Panel -> System -> Advanced System Settings -> Environment Variables``.
-The following three directories must be in PATH, in this order:
+The following directories must be in your PATH, in this order:
* ``\c\bin``
* ``\perl\site\bin``
* ``\perl\bin``
+* ``\perl\vendor\lib\auto\XML\LibXML`` (may only be required on some systems)
Be sure to close and re-open any existing ``cmd.exe`` windows after updating
your PATH.
-If you already have a different version of Perl (for example the one from Cygwin),
+If you already have a different version of Perl installed (for example, from Cygwin),
you can run into some trouble. Either remove the other Perl install from PATH, or
install XML::LibXML and XML::LibXSLT for it using CPAN.
@@ -561,7 +621,7 @@ due to the tiny window size and extremely limited scrollback. For that reason yo
may prefer to compile in the IDE which will always show all build output.
Alternatively (or additionally), consider installing an improved Windows terminal
-such as `Cmder `_. Easily installed through Chocolatey with:
+such as `Cmder `_. Easily installed through Chocolatey with:
``choco install cmder -y``.
**Note for Cygwin/msysgit users**: It is also possible to compile DFHack from a
@@ -607,129 +667,8 @@ Then build the ``INSTALL`` target listed under ``CMakePredefinedTargets``.
Building the documentation
==========================
-DFHack documentation, like the file you are reading now, is created as .rst files,
-which are in `reStructuredText (reST) `_ format.
-This is a documenation format that has come from the Python community. It is very
-similar in concept - and in syntax - to Markdown, as found on GitHub and many other
-places. However it is more advanced than Markdown, with more features available when
-compiled to HTML, such as automatic tables of contents, cross-linking, special
-external links (forum, wiki, etc) and more. The documentation is compiled by a
-Python tool, `Sphinx `_.
-
-The DFHack build process will compile the documentation but this has been disabled
-by default. You only need to build the docs if you're changing them, or perhaps
-if you want a local HTML copy; otherwise, read them easily online at
-`ReadTheDoc's DFHack hosted documentation `_.
-
-(Note that even if you do want a local copy, it is certainly not necesesary to
-compile the documentation in order to read it. Like Markdown, reST documents are
-designed to be just as readable in a plain-text editor as they are in HTML format.
-The main thing you lose in plain text format is hyperlinking.)
-
-
-Enabling documentation building
--------------------------------
-First, make sure you have followed all the necessary steps for your platform as
-outlined in the rest of this document.
-
-To compile documentation with DFHack, add the following flag to your ``cmake`` command::
-
- -DBUILD_DOCS:bool=ON
-
-For example::
-
- cmake .. -DCMAKE_BUILD_TYPE:string=Release -DBUILD_DOCS:bool=ON -DCMAKE_INSTALL_PREFIX=
-
-Alternatively you can use the CMake GUI which allows options to be changed easily.
-
-On Windows you should either use ``generate-msvc-gui.bat`` and set the option
-through the GUI, or else if you want to use an alternate file, such as
-``generate-msvc-all.bat``, you will need to edit it to add the flag.
-Or you could just run ``cmake`` on the command line like in other platforms.
-
-Required dependencies
----------------------
-In order to build the documentation, you must have Python with Sphinx
-version 1.3.1 or later. Both Python 2.x and 3.x are supported.
-
-When installing Sphinx from OS package managers, be aware that there is
-another program called Sphinx, completely unrelated to documentation management.
-Be sure you are installing the right Sphinx; it may be called ``python-sphinx``,
-for example. To avoid doubt, ``pip`` can be used instead as detailed below.
-
-
-Linux
------
-Most Linux distributions will include Python as standard.
-
-Check your package manager to see if Sphinx 1.3.1 or later is available,
-but at the time of writing Ubuntu for example only has 1.2.x.
-
-You can instead install Sphinx with the pip package manager. This may need
-to be installed from your OS package manager; this is the case on Ubuntu.
-On Ubuntu/Debian, use the following to first install pip::
-
- sudo apt-get install python-pip
-
-Once pip is available, you can then install the Python Sphinx module with::
-
- pip install sphinx
-
-If you run this as a normal user it will install a local copy for your user only.
-Run it with sudo if you want a system-wide install. Either is fine for DFHack,
-however if installing locally do check that ``sphinx-build`` is in your path.
-It may be installed in a directory such as ``~/.local/bin/``, so after pip
-install, find ``sphinx-build`` and ensure its directory is in your local ``$PATH``.
-
-
-Mac OS X
---------
-OS X has Python 2.7 installed by default, but it does not have the pip package manager.
-
-You can install Homebrew's Python 3, which includes pip, and then install the
-latest Sphinx using pip::
-
- brew install python3
- pip3 install sphinx
-
-Alternatively, you can simply install Sphinx 1.3.x directly from Homebrew::
-
- brew install sphinx-doc
-
-This will install Sphinx for OS X's system Python 2.7, without needing pip.
-
-Either method works; if you plan to use Python for other purposes, it might best
-to install Homebrew's Python 3 so that you have the latest Python as well as pip.
-If not, just installing sphinx-doc for OS X's system Python 2.7 is fine.
-
-
-Windows
--------
-Use the Chocolatey package manager to install Python and pip,
-then use pip to install Sphinx.
-
-Run the following commands from an elevated (Admin) ``cmd.exe``, after installing
-Chocolatey as outlined in the `Windows section `::
-
- choco install python pip -y
-
-Then close that Admin ``cmd.exe``, re-open another Admin ``cmd.exe``, and run::
-
- pip install sphinx
-
-.. _build-changelog:
-
-Building the changelogs
------------------------
-If you have Python installed, but do not want to build all of the documentation,
-you can build the changelogs with the ``docs/gen_changelog.py`` script.
-
-All changes should be listed in ``changelog.txt``. A description of this file's
-format follows:
-
-.. include:: /docs/changelog.txt
- :start-after: ===help
- :end-before: ===end
+The steps above will not build DFHack's documentation by default. If you are
+editing documentation, see `documentation` for details on how to build it.
Misc. Notes
===========
@@ -767,7 +706,7 @@ files alphabetically, so all the files you need should be next to each other.
It is recommended that you create a build folder and run CMake to verify that
you have downloaded everything at this point, assuming your download machine has
CMake installed. This involves running a "generate" batch script on Windows, or
-a command starting with ``cmake .. -G Ninja`` on Linux and OS X, following the
+a command starting with ``cmake .. -G Ninja`` on Linux and macOS, following the
instructions in the sections above. CMake should automatically locate files that
you placed in ``CMake/downloads``, and use them instead of attempting to
download them.
diff --git a/docs/Contributing.rst b/docs/Contributing.rst
new file mode 100644
index 000000000..0619e8ba3
--- /dev/null
+++ b/docs/Contributing.rst
@@ -0,0 +1,86 @@
+.. _contributing:
+
+###########################
+How to contribute to DFHack
+###########################
+
+.. contents:: Contents
+ :local:
+
+.. _contributing-code:
+
+Contributing Code
+=================
+Several things should be kept in mind when contributing code to DFHack.
+
+Code format
+-----------
+* Four space indents for C++. Never use tabs for indentation in any language.
+* LF (Unix style) line terminators
+* Avoid trailing whitespace
+* UTF-8 encoding
+* For C++:
+
+ * Opening and closing braces on their own lines or opening brace at the end of the previous line
+ * Braces placed at original indent level if on their own lines
+ * #includes should be sorted. C++ libraries first, then dfhack modules, then df structures,
+ then local includes. Within each category they should be sorted alphabetically.
+
+Pull request guidelines
+-----------------------
+* Pull requests should be based on (and submitted to) the default branch of the
+ relevant repo, which is the branch you see when you access the repo on GitHub
+ or clone the repo without specifying a branch. As of 0.47.04-r1, this is
+ ``develop`` for the main DFHack repo and ``master`` for other repos.
+* Use a new branch for each feature or bugfix so that your changes can be merged
+ independently (i.e. not the ``master`` or ``develop`` branch of your fork).
+
+ * An exception: for a collection of small miscellaneous changes (e.g.
+ structures research), one branch instead of many small branches is fine. It
+ is still preferred that this branch be dedicated to this purpose, i.e. not
+ ``master`` or ``develop``. Your pull request may be merged at any point
+ unless you indicate that it isn't ready (see below), but you can continue to
+ push to the same branch and open new pull requests as needed.
+
+* Try to keep pull requests relatively small so that they are easier to review
+ and merge.
+
+ * If you expect to make a large number of related additions or changes (e.g.
+ adding a large new plugin), multiple PRs are preferred, as they allow more
+ frequent (and easier) feedback. If development of this feature is expected
+ to take a while, we may create a dedicated branch to merge your pull
+ requests into instead of the repo's default branch.
+
+* If you plan to make additional changes to your pull request in the near
+ future, or if it isn't quite ready to be merged, mark it as a
+ `draft pull request `_
+ or add "WIP" to the title. Otherwise, your pull request may be reviewed and/or
+ merged prematurely.
+
+General contribution guidelines
+-------------------------------
+* If convenient, compile on multiple platforms when changing anything that
+ compiles. Our CI should catch anything that fails to build, but checking in
+ advance can be faster.
+* Update documentation when applicable - see `docs-standards` for details.
+* Update ``changelog.txt`` and ``docs/Authors.rst`` when applicable. See
+ `build-changelog` for more information on the changelog format.
+* Submit ideas and bug reports as :issue:`issues on GitHub <>`.
+ Posts in the forum thread can easily get missed or forgotten.
+* Work on :issue:`reported problems `
+ will take priority over ideas or suggestions.
+
+
+Other ways to help
+==================
+DFHack is a software project, but there's a lot more to it than programming.
+If you're not comfortable programming, you can help by:
+
+* reporting bugs and incomplete documentation
+* improving the documentation
+* finding third-party scripts to add
+* writing tutorials for newbies
+
+All those things are crucial, and often under-represented. So if that's
+your thing, go get started!
+
diff --git a/docs/Core.rst b/docs/Core.rst
index 4e65f4dda..4fdecbf63 100644
--- a/docs/Core.rst
+++ b/docs/Core.rst
@@ -4,8 +4,9 @@
DFHack Core
###########
-.. contents::
- :depth: 2
+.. contents:: Contents
+ :local:
+ :depth: 2
Command Implementation
@@ -14,12 +15,12 @@ DFHack commands can be implemented in three ways, all of which
are used in the same way:
:builtin: commands are implemented by the core of DFHack. They manage
- other DFhack tools, interpret commands, and control basic
+ other DFHack tools, interpret commands, and control basic
aspects of DF (force pause or quit).
:plugins: are stored in ``hack/plugins/`` and must be compiled with the
same version of DFHack. They are less flexible than scripts,
- but used for complex or ongoing tasks becasue they run faster.
+ but used for complex or ongoing tasks because they run faster.
:scripts: are Ruby or Lua scripts stored in ``hack/scripts/``.
Because they don't need to be compiled, scripts are
@@ -62,7 +63,9 @@ or at any other time using the ``dfhack-run`` executable.
If DF/DFHack is started with arguments beginning with ``+``, the remaining
text is treated as a command in the DFHack console. It is possible to use
-multiple such commands, which are split on ``+``. For example::
+multiple such commands, which are split on ``+``. For example:
+
+.. code-block:: shell
./dfhack +load-save region1
"Dwarf Fortress.exe" +devel/print-args Hello! +enable workflow
@@ -81,18 +84,20 @@ dfhack-run
If DF and DFHack are already running, calling ``dfhack-run my command``
in an external terminal is equivalent to calling ``my command`` in the
-DFHack console. Direct use of the DFhack console is generally easier,
+DFHack console. Direct use of the DFHack console is generally easier,
but ``dfhack-run`` can be useful in a variety of circumstances:
- if the console is unavailable
- with the init setting ``PRINT_MODE:TEXT``
- - while running an interactive command (eg. `liquids` or `tiletypes`)
+ - while running an interactive command (e.g. `liquids` or `tiletypes`)
- from external programs or scripts
- if DF or DFHack are not responding
-Examples::
+Examples:
+
+.. code-block:: shell
./dfhack-run cursecheck
dfhack-run kill-lua
@@ -100,11 +105,19 @@ Examples::
The first (\*nix) example `checks for vampires `; the
second (Windows) example uses `kill-lua` to stop a Lua script.
+.. note::
+
+ ``dfhack-run`` attempts to connect to a server on TCP port 5000. If DFHack
+ was unable to start this server, ``dfhack-run`` will not be able to connect.
+ This could happen if you have other software listening on port 5000, or if
+ you have multiple copies of DF running simultaneously. To assign a different
+ port, see `remote-server-config`.
+
Built-in Commands
=================
The following commands are provided by the 'core' components
-of DFhack, rather than plugins or scripts.
+of DFHack, rather than plugins or scripts.
.. contents::
:local:
@@ -165,10 +178,13 @@ right place to do it.
Most such plugins or scripts support the built-in ``enable`` and ``disable``
commands. Calling them at any time without arguments prints a list
of enabled and disabled plugins, and shows whether that can be changed
-through the same commands.
+through the same commands. Passing plugin names to these commands will enable
+or disable the specified plugins. For example, to enable the `manipulator`
+plugin::
+
+ enable manipulator
-To enable or disable plugins that support this, use their names as
-arguments for the command::
+It is also possible to enable or disable multiple plugins at once::
enable manipulator search
@@ -271,6 +287,9 @@ something. Usage::
Allows dealing with plugins individually by name, or all at once.
+Note that plugins do not maintain their enabled state if they are reloaded, so
+you may need to use `enable` to re-enable a plugin after reloading it.
+
.. _ls:
@@ -404,11 +423,11 @@ onLoad*.init
When a world is loaded, DFHack looks for files of the form ``onLoad*.init``,
where ``*`` can be any string, including the empty string.
-All matching init files will be executed in alphebetical order.
+All matching init files will be executed in alphabetical order.
A world being loaded can mean a fortress, an adventurer, or legends mode.
These files are best used for non-persistent commands, such as setting
-a `fix ` script to run on `repeat`.
+a `fix ` script to run on `repeat`.
.. _onUnload.init:
@@ -429,23 +448,74 @@ Other init files
* ``onMapLoad*.init`` and ``onMapUnload*.init`` are run when a map,
distinct from a world, is loaded. This is good for map-affecting
- commands (eg `clean`), or avoiding issues in Legends mode.
+ commands (e.g. `clean`), or avoiding issues in Legends mode.
* Any lua script named ``raw/init.d/*.lua``, in the save or main DF
directory, will be run when any world or that save is loaded.
-Environment variables
+.. _dfhack-config:
+
+Configuration Files
+===================
+
+Some DFHack settings can be changed by modifying files in the ``dfhack-config``
+folder (which is in the DF folder). The default versions of these files, if they
+exist, are in ``dfhack-config/default`` and are installed when DFHack starts if
+necessary.
+
+.. _script-paths:
+
+Script paths
+------------
+
+Script paths are folders that DFHack searches to find a script when a command is
+run. By default, the following folders are searched, in order (relative to the
+root DF folder):
+
+1. :file:`data/save/{}/raw/scripts` (only if a save is loaded)
+2. :file:`raw/scripts`
+3. :file:`hack/scripts`
+
+For example, if ``teleport`` is run, these folders are searched in order for
+``teleport.lua`` or ``teleport.rb``, and the first matching file is run.
+
+Script paths can be added by modifying :file:`dfhack-config/script-paths.txt`.
+Each line should start with one of these characters:
+
+- ``+``: adds a script path that is searched *before* the default paths (above)
+- ``-``: adds a script path that is searched *after* the default paths
+- ``#``: a comment (the line is ignored)
+
+Paths can be absolute or relative - relative paths are interpreted relative to
+the root DF folder.
+
+.. admonition:: Tip
+
+ When developing scripts in the :source:scripts:`dfhack/scripts repo <>`,
+ it may be useful to add the path to your local copy of the repo with ``+``.
+ This will allow you to make changes in the repo and have them take effect
+ immediately, without needing to re-install or copy scripts over manually.
+
+
+Script paths can also be modified programmatically through the `Lua API `.
+
+.. _env-vars:
+
+Environment Variables
=====================
DFHack's behavior can be adjusted with some environment variables. For example,
-on UNIX-like systems::
+on UNIX-like systems:
+
+.. code-block:: shell
DFHACK_SOME_VAR=1 ./dfhack
- ``DFHACK_PORT``: the port to use for the RPC server (used by ``dfhack-run``
and `remotefortressreader` among others) instead of the default ``5000``. As
with the default, if this port cannot be used, the server is not started.
+ See `remote` for more details.
- ``DFHACK_DISABLE_CONSOLE``: if set, the DFHack console is not set up. This is
the default behavior if ``PRINT_MODE:TEXT`` is set in ``data/init/init.txt``.
@@ -487,5 +557,5 @@ This section is for odd but important notes that don't fit anywhere else.
Older versions are available here_.
*These files will eventually be migrated to GitHub.* (see :issue:`473`)
- .. _DFFD: http://dffd.bay12games.com/search.php?string=DFHack&id=15&limit=1000
- .. _here: http://dethware.org/dfhack/download
+ .. _DFFD: https://dffd.bay12games.com/search.php?string=DFHack&id=15&limit=1000
+ .. _here: https://dethware.org/dfhack/download
diff --git a/docs/Dev-intro.rst b/docs/Dev-intro.rst
new file mode 100644
index 000000000..2a17313fe
--- /dev/null
+++ b/docs/Dev-intro.rst
@@ -0,0 +1,82 @@
+===========================
+DFHack development overview
+===========================
+
+DFHack has various components; this page provides an overview of some. If you
+are looking to develop a tool for DFHack, developing a script or plugin is
+likely the most straightforward choice.
+
+Other pages that may be relevant include:
+
+- `contributing`
+- `documentation`
+- `license`
+
+
+.. contents:: Contents
+ :local:
+
+
+Plugins
+-------
+
+DFHack plugins are written in C++ and located in the ``plugins`` folder.
+Currently, documentation on how to write plugins is somewhat sparse. There are
+templates that you can get use to get started in the ``plugins/skeleton``
+folder, and the source code of existing plugins can also be helpful.
+
+If you want to compile a plugin that you have just added, you will need to add a
+call to ``DFHACK_PLUGIN`` in ``plugins/CMakeLists.txt``.
+
+Plugins have the ability to make one or more commands available to users of the
+DFHack console. Examples include `3dveins` (which implements the ``3dveins``
+command) and `reveal` (which implements ``reveal``, ``unreveal``, and several
+other commands).
+
+Plugins can also register handlers to run on every tick, and can interface with
+the built-in `enable` and `disable` commands. For the full plugin API, see the
+skeleton plugins or ``PluginManager.cpp``.
+
+Installed plugins live in the ``hack/plugins`` folder of a DFHack installation,
+and the `load` family of commands can be used to load a recompiled plugin
+without restarting DF.
+
+See `plugins-index` for a list of all plugins included in DFHack.
+
+Scripts
+-------
+
+DFHack scripts can currently be written in Lua or Ruby. The `Lua API `
+is more complete and currently better-documented, however. Referring to existing
+scripts as well as the API documentation can be helpful when developing new
+scripts.
+
+`Scripts included in DFHack ` live in a separate `scripts repository `_.
+This can be found in the ``scripts`` submodule if you have
+`cloned DFHack `, or the ``hack/scripts`` folder
+of an installed copy of DFHack.
+
+Core
+----
+
+The `DFHack core ` has a variety of low-level functions. It is
+responsible for hooking into DF (via SDL), providing a console, and providing an
+interface for plugins and scripts to interact with DF.
+
+Modules
+-------
+
+A lot of shared code to interact with DF in more complicated ways is contained
+in **modules**. For example, the Units module contains functions for checking
+various traits of units, changing nicknames properly, and more. Generally, code
+that is useful to multiple plugins and scripts should go in the appropriate
+module, if there is one.
+
+Several modules are also `exposed to Lua `, although
+some functions (and some entire modules) are currently only available in C++.
+
+Remote access interface
+-----------------------
+
+DFHack provides a remote access interface that external tools can connect to and
+use to interact with DF. See `remote` for more information.
diff --git a/docs/Documentation.rst b/docs/Documentation.rst
new file mode 100644
index 000000000..03531998e
--- /dev/null
+++ b/docs/Documentation.rst
@@ -0,0 +1,304 @@
+.. _documentation:
+
+###########################
+DFHack Documentation System
+###########################
+
+
+DFHack documentation, like the file you are reading now, is created as ``.rst`` files,
+which are in `reStructuredText (reST) `_ format.
+This is a documentation format common in the Python community. It is very
+similar in concept - and in syntax - to Markdown, as found on GitHub and many other
+places. However it is more advanced than Markdown, with more features available when
+compiled to HTML, such as automatic tables of contents, cross-linking, special
+external links (forum, wiki, etc) and more. The documentation is compiled by a
+Python tool, `Sphinx `_.
+
+The DFHack build process will compile the documentation, but this is disabled
+by default due to the additional Python and Sphinx requirements. You typically
+only need to build the docs if you're changing them, or perhaps
+if you want a local HTML copy; otherwise, you can read an
+`online version hosted by ReadTheDocs `_.
+
+(Note that even if you do want a local copy, it is certainly not necessary to
+compile the documentation in order to read it. Like Markdown, reST documents are
+designed to be just as readable in a plain-text editor as they are in HTML format.
+The main thing you lose in plain text format is hyperlinking.)
+
+.. contents:: Contents
+ :local:
+
+.. _docs-standards:
+
+Documentation standards
+=======================
+
+Whether you're adding new code or just fixing old documentation (and there's plenty),
+there are a few important standards for completeness and consistent style. Treat
+this section as a guide rather than iron law, match the surrounding text, and you'll
+be fine.
+
+Each command should have a short (~54 character) help string, which is shown
+by the `ls` command. For scripts, this is a comment on the first line
+(the comment marker and whitespace is stripped). For plugins it's the second
+argument to ``PluginCommand``. Please make this brief but descriptive!
+
+Everything should be documented! If it's not clear *where* a particular
+thing should be documented, ask on IRC or in the DFHack thread on Bay12 -
+as well as getting help, you'll be providing valuable feedback that
+makes it easier for future readers!
+
+Scripts can use a custom autodoc function, based on the Sphinx ``include``
+directive - anything between the tokens is copied into the appropriate scripts
+documentation page. For Ruby, we follow the built-in docstring convention
+(``=begin`` and ``=end``). For Lua, the tokens are ``[====[`` and ``]====]``
+- ordinary multi-line strings. It is highly encouraged to reuse this string
+as the in-console documentation by (e.g.) printing it when a ``-help`` argument
+is given.
+
+The docs **must** have a heading which exactly matches the command, underlined
+with ``=====`` to the same length. For example, a lua file would have:
+
+.. code-block:: lua
+
+ local helpstr = [====[
+
+ add-thought
+ ===========
+ Adds a thought or emotion to the selected unit. Can be used by other scripts,
+ or the gui invoked by running ``add-thought gui`` with a unit selected.
+
+ ]====]
+
+
+.. highlight:: rst
+
+Where the heading for a section is also the name of a command, the spelling
+and case should exactly match the command to enter in the DFHack command line.
+
+Try to keep lines within 80-100 characters, so it's readable in plain text
+in the terminal - Sphinx (our documentation system) will make sure
+paragraphs flow.
+
+If there aren't many options or examples to show, they can go in a paragraph of
+text. Use double-backticks to put commands in monospaced font, like this::
+
+ You can use ``cleanowned scattered x`` to dump tattered or abandoned items.
+
+If the command takes more than three arguments, format the list as a table
+called Usage. The table *only* lists arguments, not full commands.
+Input values are specified in angle brackets. Example::
+
+ Usage:
+
+ :arg1: A simple argument.
+ :arg2 : Does something based on the input value.
+ :Very long argument:
+ Is very specific.
+
+To demonstrate usage - useful mainly when the syntax is complicated, list the
+full command with arguments in monospaced font, then indent the next line and
+describe the effect::
+
+ ``resume all``
+ Resumes all suspended constructions.
+
+If it would be helpful to mention another DFHack command, don't just type the
+name - add a hyperlink! Specify the link target in backticks, and it will be
+replaced with the corresponding title and linked: e.g. ```autolabor```
+=> `autolabor`. Link targets should be equivalent to the command
+described (without file extension), and placed above the heading of that
+section like this::
+
+ .. _autolabor:
+
+ autolabor
+ =========
+
+Add link targets if you need them, but otherwise plain headings are preferred.
+Scripts have link targets created automatically.
+
+
+Building the documentation
+==========================
+
+.. highlight:: shell
+
+Required dependencies
+---------------------
+In order to build the documentation, you must have Python with Sphinx
+version |sphinx_min_version| or later. Both Python 2.x and 3.x are supported.
+
+When installing Sphinx from OS package managers, be aware that there is
+another program called Sphinx, completely unrelated to documentation management.
+Be sure you are installing the right Sphinx; it may be called ``python-sphinx``,
+for example. To avoid doubt, ``pip`` can be used instead as detailed below.
+
+Once you have installed Sphinx, ``sphinx-build --version`` should report the
+version of Sphinx that you have installed. If this works, CMake should also be
+able to find Sphinx.
+
+For more detailed platform-specific instructions, see the sections below:
+
+.. contents::
+ :local:
+ :backlinks: none
+
+
+Linux
+~~~~~
+Most Linux distributions will include Python by default. If not, start by
+installing Python (preferably Python 3). On Debian-based distros::
+
+ sudo apt install python3
+
+Check your package manager to see if Sphinx |sphinx_min_version| or later is
+available. On Debian-based distros, this package is named ``python3-sphinx``.
+If this package is new enough, you can install it directly. If not, or if you
+want to use a newer Sphinx version (which may result in faster builds), you
+can install Sphinx through the ``pip`` package manager instead. On Debian-based
+distros, you can install pip with::
+
+ sudo apt install python3-pip
+
+Once pip is available, you can then install Sphinx with::
+
+ pip3 install sphinx
+
+If you run this as an unprivileged user, it may install a local copy of Sphinx
+for your user only. The ``sphinx-build`` executable will typically end up in
+``~/.local/bin/`` in this case. Alternatively, you can install Sphinx
+system-wide by running pip with ``sudo``. In any case, you will need the folder
+containing ``sphinx-build`` to be in your ``$PATH``.
+
+macOS
+~~~~~
+macOS has Python 2.7 installed by default, but it does not have the pip package manager.
+
+You can install Homebrew's Python 3, which includes pip, and then install the
+latest Sphinx using pip::
+
+ brew install python3
+ pip3 install sphinx
+
+Alternatively, you can simply install Sphinx directly from Homebrew::
+
+ brew install sphinx-doc
+
+This will install Sphinx for macOS's system Python 2.7, without needing pip.
+
+Either method works; if you plan to use Python for other purposes, it might best
+to install Homebrew's Python 3 so that you have the latest Python as well as pip.
+If not, just installing sphinx-doc for macOS's system Python 2.7 is fine.
+
+
+Windows
+~~~~~~~
+Python for Windows can be downloaded `from python.org `_.
+The latest version of Python 3 is recommended, as it includes pip already.
+
+You can also install Python and pip through the Chocolatey package manager.
+After installing Chocolatey as outlined in the `Windows compilation instructions `,
+run the following command from an elevated (admin) command prompt (e.g. ``cmd.exe``)::
+
+ choco install python pip -y
+
+Once you have pip available, you can install Sphinx with the following command::
+
+ pip install sphinx
+
+Note that this may require opening a new (admin) command prompt if you just
+installed pip from the same command prompt.
+
+
+Using CMake
+-----------
+
+Enabling the ``BUILD_DOCS`` CMake option will cause the documentation to be built
+whenever it changes as part of the normal DFHack build process. There are several
+ways to do this:
+
+* When initially running CMake, add ``-DBUILD_DOCS:bool=ON`` to your ``cmake``
+ command. For example::
+
+ cmake .. -DCMAKE_BUILD_TYPE:string=Release -DBUILD_DOCS:bool=ON -DCMAKE_INSTALL_PREFIX=
+
+* If you have already run CMake, you can simply run it again from your build
+ folder to update your configuration::
+
+ cmake .. -DBUILD_DOCS:bool=ON
+
+* You can edit the ``BUILD_DOCS`` setting in CMakeCache.txt directly
+
+* You can use the CMake GUI to change ``BUILD_DOCS``
+
+* On Windows, if you prefer to use the batch scripts, you can run
+ ``generate-msvc-gui.bat`` and set ``BUILD_DOCS`` through the GUI. If you are
+ running another file, such as ``generate-msvc-all.bat``, you will need to edit
+ it to add the flag. You can also run ``cmake`` on the command line, similar to
+ other platforms.
+
+Running Sphinx manually
+-----------------------
+
+You can also build the documentation without going through CMake, which may be
+faster. There is a ``docs/build.sh`` script provided for Linux and macOS that
+will run essentially the same command that CMake runs - see the script for
+additional options.
+
+To build the documentation with default options, run the following command from
+the root DFHack folder::
+
+ sphinx-build . docs/html
+
+Sphinx has many options to enable clean builds, parallel builds, logging, and
+more - run ``sphinx-build --help`` for details.
+
+Building a PDF version
+----------------------
+
+ReadTheDocs automatically builds a PDF version of the documentation (available
+under the "Downloads" section when clicking on the release selector). If you
+want to build a PDF version locally, you will need ``pdflatex``, which is part
+of a TeX distribution. The following command will then build a PDF, located in
+``docs/pdf/latex/DFHack.pdf``, with default options::
+
+ sphinx-build -M latexpdf . ./docs/pdf
+
+There is a ``docs/build-pdf.sh`` script provided for Linux and macOS that runs
+this command for convenience - see the script for additional options.
+
+.. _build-changelog:
+
+Building the changelogs
+=======================
+If you have Python installed, but do not want to build all of the documentation,
+you can build the changelogs with the ``docs/gen_changelog.py`` script. This
+script provides additional options, including one to build individual changelogs
+for all DFHack versions - run ``python docs/gen_changelog.py --help`` for details.
+
+Changelog entries are obtained from ``changelog.txt`` files in multiple repos.
+This allows changes to be listed in the same repo where they were made. These
+changelogs are combined as part of the changelog build process:
+
+* ``docs/changelog.txt`` for changes in the main ``dfhack`` repo
+* ``scripts/changelog.txt`` for changes made to scripts in the ``scripts`` repo
+* ``library/xml/changelog.txt`` for changes made in the ``df-structures`` repo
+
+Building the changelogs generates two files: ``docs/_auto/news.rst`` and
+``docs/_auto/news-dev.rst``. These correspond to `changelog` and `dev-changelog`
+and contain changes organized by stable and development DFHack releases,
+respectively. For example, an entry listed under "0.44.05-alpha1" in
+changelog.txt will be listed under that version in the development changelog as
+well, but under "0.44.05-r1" in the stable changelog (assuming that is the
+closest stable release after 0.44.05-alpha1). An entry listed under a stable
+release like "0.44.05-r1" in changelog.txt will be listed under that release in
+both the stable changelog and the development changelog.
+
+
+Changelog syntax
+----------------
+
+.. include:: /docs/changelog.txt
+ :start-after: ===help
+ :end-before: ===end
diff --git a/docs/History.rst b/docs/History.rst
index 8386c4cab..dc02d02b0 100644
--- a/docs/History.rst
+++ b/docs/History.rst
@@ -1,16 +1,19 @@
:orphan:
-.. _HISTORY:
+.. _History:
-########################
-HISTORY - old changelogs
-########################
+#####################
+Historical changelogs
+#####################
-This file is where old changelogs live, so the current `changelog`
-in ``NEWS.rst`` doesn't get too long.
+This file is where old changelogs live, so the `current changelog `
+doesn't get too long. Some of these changelogs are also formatted differently
+from current changelogs and would be difficult for the current `changelog
+generation system ` to handle.
-.. contents::
- :depth: 2
+.. contents:: Contents
+ :local:
+ :depth: 1
DFHack 0.43.05-r3
=================
@@ -224,7 +227,7 @@ Internals
Lua
---
-- Lua has been updated to 5.3 - see http://www.lua.org/manual/5.3/readme.html for details
+- Lua has been updated to 5.3 - see https://www.lua.org/manual/5.3/readme.html for details
- Floats are no longer implicitly converted to integers in DFHack API calls
diff --git a/docs/Installing.rst b/docs/Installing.rst
new file mode 100644
index 000000000..5b564f45f
--- /dev/null
+++ b/docs/Installing.rst
@@ -0,0 +1,168 @@
+.. _installing:
+
+=================
+Installing DFHack
+=================
+
+.. contents::
+ :local:
+
+
+Requirements
+============
+
+DFHack supports Windows, Linux, and macOS, and both 64-bit and 32-bit builds
+of Dwarf Fortress.
+
+.. _installing-df-version:
+
+DFHack releases generally only support the version of Dwarf Fortress that they
+are named after. For example, DFHack 0.40.24-r5 only supported DF 0.40.24.
+DFHack releases *never* support newer versions of DF, because DFHack requires
+data about DF that is only possible to obtain after DF has been released.
+Occasionally, DFHack releases will be able to maintain support for older
+versions of DF - for example, DFHack 0.34.11-r5 supported both DF 0.34.11 and
+0.34.10. For maximum stability, you should usually use the latest versions of
+both DF and DFHack.
+
+Windows
+-------
+
+* DFHack only supports the SDL version of Dwarf Fortress. The "legacy" version
+ will *not* work with DFHack (the "small" SDL version is acceptable, however).
+* Windows XP and older are *not* supported, due in part to a
+ `Visual C++ 2015 bug `_
+
+The Windows build of DFHack should work under Wine on other operating systems,
+although this is not tested very often. It is recommended to use the native
+build for your operating system instead.
+
+.. _installing-reqs-linux:
+
+Linux
+-----
+
+Generally, DFHack should work on any modern Linux distribution. There are
+multiple release binaries provided - as of DFHack 0.47.04-r1, there are built
+with GCC 7 and GCC 4.8 (as indicated by the ``gcc`` component of their
+filenames). Using the newest build that works on your system is recommended.
+The GCC 4.8 build is built on Ubuntu 14.04 and targets an older glibc, so it
+should work on older distributions.
+
+In the event that none of the provided binaries work on your distribution,
+you may need to `compile DFHack from source `.
+
+macOS
+-----
+
+OS X 10.6.8 or later is required.
+
+
+.. _downloading:
+
+Downloading DFHack
+==================
+
+Stable builds of DFHack are available on `GitHub `_.
+GitHub has been known to change their layout periodically, but as of July 2020,
+downloads are available at the bottom of the release notes for each release, under a section
+named "Assets" (which you may have to expand). The name of the file indicates
+which DF version, platform, and architecture the build supports - the platform
+and architecture (64-bit or 32-bit) **must** match your build of DF. The DF
+version should also match your DF version - see `above `
+for details. For example:
+
+* ``dfhack-0.47.04-r1-Windows-64bit.zip`` supports 64-bit DF on Windows
+* ``dfhack-0.47.04-r1-Linux-32bit-gcc-7.tar.bz2`` supports 32-bit DF on Linux
+ (see `installing-reqs-linux` for details on the GCC version indicator)
+
+The `DFHack website `_ also provides links to
+unstable builds. These files have a different naming scheme, but the same
+restrictions apply (e.g. a file named ``Windows64`` is for 64-bit Windows DF).
+
+.. warning::
+
+ Do *not* download the source code from GitHub, either from the releases page
+ or by clicking "Download ZIP" on the repo homepage. This will give you an
+ incomplete copy of the DFHack source code, which will not work as-is. (If
+ you want to compile DFHack instead of using a pre-built release, see
+ `compile` for instructions.)
+
+Installing DFHack
+=================
+
+When you `download DFHack `, you will end up with a release archive
+(a ``.zip`` file on Windows, or a ``.tar.bz2`` file on other platforms). Your
+operating system should have built-in utilities capable of extracting files from
+these archives.
+
+The release archives contain several files and folders, including a ``hack``
+folder, a ``dfhack-config`` folder, and a ``dfhack.init-example`` file. To
+install DFHack, copy all of the files from the DFHack archive into the root DF
+folder, which should already include a ``data`` folder and a ``raw`` folder,
+among other things. Some packs and other redistributions of Dwarf Fortress may
+place DF in another folder, so ensure that the ``hack`` folder ends up next to
+the ``data`` folder.
+
+.. note::
+
+ On Windows, installing DFHack will overwrite ``SDL.dll``. This is
+ intentional and necessary for DFHack to work, so be sure to choose to
+ overwrite ``SDL.dll`` if prompted. (If you are not prompted, you may be
+ installing DFHack in the wrong place.)
+
+
+Uninstalling DFHack
+===================
+
+Uninstalling DFHack essentially involves reversing what you did to install
+DFHack. On Windows, replace ``SDL.dll`` with ``SDLreal.dll`` first. Then, you
+can remove any files that were part of the DFHack archive. DFHack does not
+currently maintain a list of these files, so if you want to completely remove
+them, you should consult the DFHack archive that you installed for a full list.
+Generally, any files left behind should not negatively affect DF.
+
+
+Upgrading DFHack
+================
+
+The recommended approach to upgrade DFHack is to uninstall DFHack first, then
+install the new version. This will ensure that any files that are only part
+of the older DFHack installation do not affect the new DFHack installation
+(although this is unlikely to occur).
+
+It is also possible to overwrite an existing DFHack installation in-place.
+To do this, follow the installation instructions above, but overwrite all files
+that exist in the new DFHack archive (on Windows, this includes ``SDL.dll`` again).
+
+.. note::
+
+ You may wish to make a backup of your ``dfhack-config`` folder first if you
+ have made changes to it. Some archive managers (e.g. Archive Utility on macOS)
+ will overwrite the entire folder, removing any files that you have added.
+
+
+Pre-packaged DFHack installations
+=================================
+
+There are :wiki:`several packs available ` that include
+DF, DFHack, and other utilities. If you are new to Dwarf Fortress and DFHack,
+these may be easier to set up. Note that these packs are not maintained by the
+DFHack team and vary in their release schedules and contents. Some may make
+significant configuration changes, and some may not include DFHack at all.
+
+Linux packages
+==============
+
+Third-party DFHack packages are available for some Linux distributions,
+including in:
+
+* `AUR `__, for Arch and related
+ distributions
+* `RPM Fusion `__,
+ for Fedora and related distributions
+
+Note that these may lag behind DFHack releases. If you want to use a newer
+version of DFHack, we generally recommended installing it in a clean copy of DF
+in your home folder. Attempting to upgrade an installation of DFHack from a
+package manager may break it.
diff --git a/docs/Introduction.rst b/docs/Introduction.rst
index 3a36aa538..f7525cb4f 100644
--- a/docs/Introduction.rst
+++ b/docs/Introduction.rst
@@ -7,73 +7,47 @@ Introduction and Overview
DFHack is a Dwarf Fortress memory access library, distributed with
a wide variety of useful scripts and plugins.
-The project is currently hosted at https://www.github.com/DFHack/dfhack,
-and can be downloaded from `the releases page
-`_.
+The project is currently hosted `on GitHub `_,
+and can be downloaded from `the releases page `_
+- see `installing` for installation instructions. This is also where the
+`DFHack bug tracker `_ is hosted.
-All new releases are announced in :forums:`the bay12 forums thread <139553>`,
+All new releases are announced in `the Bay12 forums thread `_,
which is also a good place for discussion and questions.
-For users, it provides a significant suite of bugfixes and interface
+For users, DFHack provides a significant suite of bugfixes and interface
enhancements by default, and more can be enabled. There are also many tools
(such as `workflow` or `autodump`) which can make life easier.
You can even add third-party scripts and plugins to do almost anything!
For modders, DFHack makes many things possible. Custom reactions, new
-interactions, magic creature abilities, and more can be set through `modtools`
+interactions, magic creature abilities, and more can be set through `scripts-modtools`
and custom raws. Non-standard DFHack scripts and inits can be stored in the
raw directory, making raws or saves fully self-contained for distribution -
or for coexistence in a single DF install, even with incompatible components.
For developers, DFHack unites the various ways tools access DF memory and
allows easier development of new tools. As an open-source project under
-`various copyleft licences `, contributions are welcome.
+`various open-source licences `, contributions are welcome.
-.. contents::
-
-
-.. _installing:
-
-Installing DFHack
-=================
-DFHack is available for the SDL version of Dwarf Fortress on Windows,
-any modern Linux distribution, and Mac OS X (10.6.8 and later).
-It is possible to use Windows DF+DFHack under Wine on Linux or OS X.
-
-Most releases only support the version of DF mentioned in their title - for
-example, DFHack 0.40.24-r2 only supports DF 0.40.24 - but some releases
-support earlier DF versions as well. Wherever possible, use the latest version
-of DFHack built for the target version of DF.
-
-Installing DFhack involves copying files from a release archive
-into your DF folder, so that:
-
-* On Windows, ``SDL.dll`` is replaced
-* On Linux or OS X, the ``dfhack`` script is placed in the same folder as the ``df`` script
-
-Uninstalling is basically the same, in reverse:
-
-* On Windows, replace ``SDL.dll`` with ``SDLreal.dll``, then remove the DFHack files.
-* On Linux or OS X, remove the DFHack files.
-
-New players may wish to :wiki:`get a pack `
-with DFHack preinstalled.
+.. contents:: Contents
+ :local:
Getting started
===============
-DFHack basically extends DF with something similar to the
-console found in many PC games.
+See `installing` for details on installing DFHack.
-If DFHack is installed correctly, it will automatically pop up a console
-window once DF is started as usual on Windows. Linux and Mac OS X require
-running the dfhack script from the terminal, and will use that terminal for
-the console.
+Once DFHack is installed, it extends DF with a console that can be used to run
+commands. On Windows, this console will open automatically when DF is started.
+On Linux and macOS, you will need to run the ``dfhack`` script from a terminal
+(instead of the ``df`` script included with DF), and that terminal will be
+used by the DFHack console.
-* Basic interaction with dfhack involves entering commands into the console.
- To learn what commands are available, you can keep reading this documentation
- or skip ahead and use the `ls` and `help` commands.
+* Basic interaction with DFHack involves entering commands into the console. To
+ learn what commands are available, you can keep reading this documentation or
+ skip ahead and use the `ls` and `help` commands.
* Another way to interact with DFHack is to set in-game `keybindings `
for certain commands. Many of the newer and user-friendly tools are designed
@@ -87,6 +61,7 @@ the console.
.. _troubleshooting:
+.. _support:
Troubleshooting
===============
@@ -101,7 +76,7 @@ If the search function in this documentation isn't enough and
:wiki:`the DF Wiki <>` hasn't helped, try asking in:
- the `#dfhack IRC channel on freenode `_
-- the :forums:`Bay12 DFHack thread <139553>`
+- the `Bay12 DFHack thread `_
- the `/r/dwarffortress `_ questions thread
- the thread for the mod or Starter Pack you're using (if any)
diff --git a/docs/Lua API.rst b/docs/Lua API.rst
index a4130096b..ffce7fd4e 100644
--- a/docs/Lua API.rst
+++ b/docs/Lua API.rst
@@ -1,3 +1,5 @@
+.. highlight:: lua
+
.. _lua-api:
##############
@@ -7,7 +9,7 @@ DFHack Lua API
DFHack has extensive support for
the Lua_ scripting language, providing access to:
-.. _Lua: http://www.lua.org
+.. _Lua: https://www.lua.org
1. Raw data structures used by the game.
2. Many C++ functions for high-level access to these
@@ -24,8 +26,9 @@ implemented by Lua files located in :file:`hack/lua/*`
(:file:`library/lua/*` in the git repo).
-.. contents::
- :depth: 3
+.. contents:: Contents
+ :local:
+ :depth: 2
=========================
@@ -36,16 +39,16 @@ DF data structure wrapper
:local:
Data structures of the game are defined in XML files located in :file:`library/xml`
-(and `online `_, and automatically exported
+(and `online `_, and automatically exported
to lua code as a tree of objects and functions under the ``df`` global, which
also broadly maps to the ``df`` namespace in the headers generated for C++.
.. warning::
- The wrapper provides almost raw access to the memory
- of the game, so mistakes in manipulating objects are as likely to
- crash the game as equivalent plain C++ code would be.
- eg. NULL pointer access is safely detected, but dangling pointers aren't.
+ The wrapper provides almost raw access to the memory of the game, so
+ mistakes in manipulating objects are as likely to crash the game as
+ equivalent plain C++ code would be - e.g. null pointer access is safely
+ detected, but dangling pointers aren't.
Objects managed by the wrapper can be broadly classified into the following groups:
@@ -157,7 +160,9 @@ that don't fit any of the other reference types. Such
references can only appear as a value of a pointer field,
or as a result of calling the ``_field()`` method.
-They behave as structs with one field ``value`` of the right type.
+They behave as structs with a ``value`` field of the right type. If the
+object's XML definition has a ``ref-target`` attribute, they will also have
+a read-only ``ref_target`` field set to the corresponding type object.
To make working with numeric buffers easier, they also allow
numeric indices. Note that other than excluding negative values
@@ -801,6 +806,8 @@ Random number generation
Dimension may be 1, 2 or 3 (default).
+.. _lua-cpp-func-wrappers:
+
C++ function wrappers
=====================
@@ -874,14 +881,23 @@ can be omitted.
Convert a string from DF's CP437 encoding to the correct encoding for the
DFHack console.
+.. warning::
+
+ When printing CP437-encoded text to the console (for example, names returned
+ from ``dfhack.TranslateName()``), use ``print(dfhack.df2console(text))`` to
+ ensure proper display on all platforms.
+
+
* ``dfhack.utf2df(string)``
Convert a string from UTF-8 to DF's CP437 encoding.
-**Note:** When printing CP437-encoded text to the console (for example, names
-returned from TranslateName()), use ``print(dfhack.df2console(text)`` to ensure
-proper display on all platforms.
+* ``dfhack.toSearchNormalized(string)``
+ Replace non-ASCII alphabetic characters in a CP437-encoded string with their
+ nearest ASCII equivalents, if possible, and returns a CP437-encoded string.
+ Note that the returned string may be longer than the input string. For
+ example, ``ä`` is replaced with ``a``, and ``æ`` is replaced with ``ae``.
Gui module
----------
@@ -1071,15 +1087,17 @@ Job module
Returns the unit performing the job.
-* ``dfhack.job.setJobCooldown(building,worker,timeout)``
+* ``dfhack.job.setJobCooldown(building,worker,cooldown)``
- Prevent the worker from taking jobs at the specified workshop for the specified time.
- This doesn't decrease the timeout in any circumstances.
+ Prevent the worker from taking jobs at the specified workshop for the
+ specified cooldown period (in ticks). This doesn't decrease the cooldown
+ period in any circumstances.
-* ``dfhack.job.removeWorker(job,timeout)``
+* ``dfhack.job.removeWorker(job,cooldown)``
- Removes the worker from the specified workshop job, and sets the cooldown.
- Returns *true* on success.
+ Removes the worker from the specified workshop job, and sets the cooldown
+ period (using the same logic as ``setJobCooldown``). Returns *true* on
+ success.
* ``dfhack.job.checkBuildingsNow()``
@@ -1114,7 +1132,7 @@ Job module
Does basic sanity checks to verify if the suggested item type matches
the flags in the job item.
-* ``dfhack.job.isSuitableMaterial(job_item, mat_type, mat_index)``
+* ``dfhack.job.isSuitableMaterial(job_item, mat_type, mat_index, item_type)``
Likewise, if replacing material.
@@ -1272,6 +1290,30 @@ Units module
Retrieves the profession color for the given race/caste using raws.
+* ``dfhack.units.getGoalType(unit[,goalIndex])``
+
+ Retrieves the goal type of the dream that the given unit has.
+ By default the goal of the first dream is returned.
+ The goalIndex parameter may be used to retrieve additional dream goals.
+ Currently only one dream per unit is supported by Dwarf Fortress.
+ Support for multiple dreams may be added in future versions of Dwarf Fortress.
+
+* ``dfhack.units.getGoalName(unit[,goalIndex])``
+
+ Retrieves the short name describing the goal of the dream that the given unit has.
+ By default the goal of the first dream is returned.
+ The goalIndex parameter may be used to retrieve additional dream goals.
+ Currently only one dream per unit is supported by Dwarf Fortress.
+ Support for multiple dreams may be added in future versions of Dwarf Fortress.
+
+* ``dfhack.units.isGoalAchieved(unit[,goalIndex])``
+
+ Checks if given unit has achieved the goal of the dream.
+ By default the status of the goal of the first dream is returned.
+ The goalIndex parameter may be used to check additional dream goals.
+ Currently only one dream per unit is supported by Dwarf Fortress.
+ Support for multiple dreams may be added in future versions of Dwarf Fortress.
+
* ``dfhack.units.getStressCategory(unit)``
Returns a number from 0-6 indicating stress. 0 is most stressed; 6 is least.
@@ -1292,6 +1334,12 @@ Items module
Returns true *x,y,z* of the item, or *nil* if invalid; may be not equal to item.pos if in inventory.
+* ``dfhack.items.getBookTitle(item)``
+
+ Returns the title of the "book" item, or an empty string if the item isn't a "book" or it doesn't
+ have a title. A "book" is a codex or a tool item that has page or writings improvements, such as
+ scrolls and quires.
+
* ``dfhack.items.getDescription(item, type[, decorate])``
Returns the string description of the item, as produced by the ``getItemDescription``
@@ -1403,6 +1451,8 @@ Items module
Checks whether the item is assigned to a squad.
+.. _lua-maps:
+
Maps module
-----------
@@ -1580,11 +1630,13 @@ General
using width and height for flexible dimensions.
Returns *is_flexible, width, height, center_x, center_y*.
-* ``dfhack.buildings.checkFreeTiles(pos,size[,extents,change_extents,allow_occupied])``
+* ``dfhack.buildings.checkFreeTiles(pos,size[,extents,change_extents,allow_occupied,allow_wall])``
Checks if the rectangle defined by ``pos`` and ``size``, and possibly extents,
can be used for placing a building. If ``change_extents`` is true, bad tiles
are removed from extents. If ``allow_occupied``, the occupancy test is skipped.
+ Set ``allow_wall`` to true if the building is unhindered by walls (such as an
+ activity zone).
* ``dfhack.buildings.countExtentTiles(extents,defval)``
@@ -1790,9 +1842,27 @@ Screen API
The screen module implements support for drawing to the tiled screen of the game.
Note that drawing only has any effect when done from callbacks, so it can only
-be feasibly used in the core context.
+be feasibly used in the `core context `.
+
+.. contents::
+ :local:
+
+Basic painting functions
+~~~~~~~~~~~~~~~~~~~~~~~~
-Basic painting functions:
+Common parameters to these functions include:
+
+* ``x``, ``y``: screen coordinates in tiles; the upper left corner of the screen
+ is ``x = 0, y = 0``
+* ``pen``: a `pen object `
+* ``map``: a boolean indicating whether to draw to a separate map buffer
+ (defaults to false, which is suitable for off-map text or a screen that hides
+ the map entirely). Note that only third-party plugins like TWBT currently
+ implement a separate map buffer. If no such plugins are enabled, passing
+ ``true`` has no effect. However, this parameter should still be used to ensure
+ that scripts work properly with such plugins.
+
+Functions:
* ``dfhack.screen.getWindowSize()``
@@ -1808,25 +1878,25 @@ Basic painting functions:
* ``dfhack.screen.paintTile(pen,x,y[,char,tile,map])``
- Paints a tile using given parameters. See below for a description of pen.
+ Paints a tile using given parameters. `See below ` for a description of ``pen``.
- Returns *false* if coordinates out of bounds, or other error.
+ Returns *false* on error, e.g. if coordinates are out of bounds
* ``dfhack.screen.readTile(x,y[,map])``
Retrieves the contents of the specified tile from the screen buffers.
- Returns a pen object, or *nil* if invalid or TrueType.
+ Returns a `pen object `, or *nil* if invalid or TrueType.
* ``dfhack.screen.paintString(pen,x,y,text[,map])``
Paints the string starting at *x,y*. Uses the string characters
- in sequence to override the ``ch`` field of pen.
+ in sequence to override the ``ch`` field of `pen `.
Returns *true* if painting at least one character succeeded.
* ``dfhack.screen.fillRect(pen,x1,y1,x2,y2[,map])``
- Fills the rectangle specified by the coordinates with the given pen.
+ Fills the rectangle specified by the coordinates with the given `pen `.
Returns *true* if painting at least one character succeeded.
* ``dfhack.screen.findGraphicsTile(pagename,x,y)``
@@ -1862,7 +1932,12 @@ Basic painting functions:
Returns the keybinding representing the given string input
character, or *nil* if impossible.
-The "pen" argument used by functions above may be represented by
+.. _lua-screen-pen:
+
+Pen API
+~~~~~~~
+
+The ``pen`` argument used by ``dfhack.screen`` functions may be represented by
a table with the following possible fields:
``ch``
@@ -1917,6 +1992,9 @@ Alternatively, it may be a pre-parsed native object with the following API:
assigning to ``pen.tile_color`` also resets ``pen.tile_fg`` and
``pen.tile_bg`` to *nil*.
+Screen management
+~~~~~~~~~~~~~~~~~
+
In order to actually be able to paint to the screen, it is necessary
to create and register a viewscreen (basically a modal dialog) with
the game.
@@ -1945,7 +2023,11 @@ Apart from a native viewscreen object, these functions accept a table
as a screen. In this case, ``show`` creates a new native viewscreen
that delegates all processing to methods stored in that table.
-.. note:: Lua-implemented screens are only supported in the core context.
+.. note::
+
+ * The `gui.Screen class ` provides stubs for all of the
+ functions listed below, and its use is recommended
+ * Lua-implemented screens are only supported in the `core context `.
Supported callbacks and fields are:
@@ -2078,10 +2160,23 @@ unless otherwise noted.
Changes the current directory to ``path``. Use with caution.
+* ``dfhack.filesystem.restore_cwd()``
+
+ Restores the current working directory to what it was when DF started.
+
+* ``dfhack.filesystem.get_initial_cwd()``
+
+ Returns the value of the working directory when DF was started.
+
* ``dfhack.filesystem.mkdir(path)``
Creates a new directory. Returns ``false`` if unsuccessful, including if ``path`` already exists.
+* ``dfhack.filesystem.mkdir_recursive(path)``
+
+ Creates a new directory, including any intermediate directories that don't exist yet.
+ Returns ``true`` if the folder was created or already existed, or ``false`` if unsuccessful.
+
* ``dfhack.filesystem.rmdir(path)``
Removes a directory. Only works if the directory is already empty.
@@ -2100,8 +2195,10 @@ unless otherwise noted.
* ``dfhack.filesystem.listdir(path)``
Lists files/directories in a directory. Returns ``{}`` if ``path`` does not exist.
+ Set include_prefix to false if you don't want the ``path`` string prepended to the
+ returned filenames.
-* ``dfhack.filesystem.listdir_recursive(path [, depth = 10])``
+* ``dfhack.filesystem.listdir_recursive(path [, depth = 10[, include_prefix = true]])``
Lists all files/directories in a directory and its subdirectories. All directories
are listed before their contents. Returns a table with subtables of the format::
@@ -2124,6 +2221,8 @@ Console API
Flushes all output to the console. This can be useful when printing text that
does not end in a newline but should still be displayed.
+.. _lua-api-internal:
+
Internal API
------------
@@ -2222,7 +2321,7 @@ and are only documented here for completeness:
* ``dfhack.internal.addScriptPath(path, search_before)``
- Adds ``path`` to the list of paths searched for scripts (both in Lua and Ruby).
+ Registers ``path`` as a `script path `.
If ``search_before`` is passed and ``true``, the path will be searched before
the default paths (e.g. ``raw/scripts``, ``hack/scripts``); otherwise, it will
be searched after.
@@ -2232,17 +2331,18 @@ and are only documented here for completeness:
* ``dfhack.internal.removeScriptPath(path)``
- Removes ``path`` from the script search paths and returns ``true`` if successful.
+ Removes ``path`` from the list of `script paths ` and returns
+ ``true`` if successful.
* ``dfhack.internal.getScriptPaths()``
- Returns the list of script paths in the order they are searched, including defaults.
- (This can change if a world is loaded.)
+ Returns the list of `script paths ` in the order they are
+ searched, including defaults. (This can change if a world is loaded.)
* ``dfhack.internal.findScript(name)``
- Searches script paths for the script ``name`` and returns the path of the first
- file found, or ``nil`` on failure.
+ Searches `script paths ` for the script ``name`` and returns the
+ path of the first file found, or ``nil`` on failure.
.. note::
This requires an extension to be specified (``.lua`` or ``.rb``) - use
@@ -2266,11 +2366,13 @@ and are only documented here for completeness:
Returns a numeric identifier of the current thread.
+.. _lua-core-context:
+
Core interpreter context
========================
While plugins can create any number of interpreter instances,
-there is one special context managed by dfhack core. It is the
+there is one special context managed by the DFHack core. It is the
only context that can receive events from DF and plugins.
Core context specific functions:
@@ -2300,7 +2402,8 @@ Core context specific functions:
* ``dfhack.onStateChange.foo = function(code)``
- Event. Receives the same codes as plugin_onstatechange in C++.
+ Creates a handler for state change events. Receives the same
+ `SC_ codes ` as ``plugin_onstatechange()`` in C++.
Event type
@@ -2312,7 +2415,7 @@ through the table with next and calls all contained values.
This is intended as an extensible way to add listeners.
This type itself is available in any context, but only the
-core context has the actual events defined by C++ code.
+`core context ` has the actual events defined by C++ code.
Features:
@@ -2379,6 +2482,8 @@ The following module management functions are provided:
should be kept limited to the standard Lua library and API described
in this document.
+.. _lua-globals:
+
Global environment
==================
@@ -2395,9 +2500,9 @@ environment by the mandatory init file dfhack.lua:
COLOR_LIGHTBLUE, COLOR_LIGHTGREEN, COLOR_LIGHTCYAN, COLOR_LIGHTRED,
COLOR_LIGHTMAGENTA, COLOR_YELLOW, COLOR_WHITE
-* ``dfhack.onStateChange`` event codes
+* State change event codes, used by ``dfhack.onStateChange``
- Available only in the core context, as is the event itself:
+ Available only in the `core context `, as is the event itself:
SC_WORLD_LOADED, SC_WORLD_UNLOADED, SC_MAP_LOADED,
SC_MAP_UNLOADED, SC_VIEWSCREEN_CHANGED, SC_CORE_INITIALIZED
@@ -2916,7 +3021,9 @@ The painting natives in ``dfhack.screen`` apply to the whole screen, are
completely stateless and don't implement clipping.
The Painter class inherits from ViewRect to provide clipping and local
-coordinates, and tracks current cursor position and current pen.
+coordinates, and tracks current cursor position and current pen. It also
+supports drawing to a separate map buffer if applicable (see ``map()`` below
+for details).
* ``Painter{ ..., pen = ..., key_pen = ... }``
@@ -2941,7 +3048,15 @@ coordinates, and tracks current cursor position and current pen.
* ``painter:cursor()``
- Returns the current cursor *x,y* in local coordinates.
+ Returns the current cursor *x,y* in screen coordinates.
+
+* ``painter:cursorX()``
+
+ Returns just the current *x* cursor coordinate
+
+* ``painter:cursorY()``
+
+ Returns just the current *y* cursor coordinate
* ``painter:seek(x,y)``
@@ -2961,10 +3076,22 @@ coordinates, and tracks current cursor position and current pen.
Sets the current pen to ``dfhack.pen.parse(old_pen,...)``, and returns *self*.
+* ``painter:color(fg[,bold[,bg]])``
+
+ Sets the specified colors of the current pen and returns *self*.
+
* ``painter:key_pen(...)``
Sets the current keybinding pen to ``dfhack.pen.parse(old_pen,...)``, and returns *self*.
+* ``painter:map(to_map)``
+
+ Enables or disables drawing to a separate map buffer. ``to_map`` is a boolean
+ that will be passed as the ``map`` parameter to any ``dfhack.screen`` functions
+ that accept it. Note that only third-party plugins like TWBT currently implement
+ a separate map buffer; if none are enabled, this function has no effect (but
+ should still be used to ensure proper support for such plugins). Returns *self*.
+
* ``painter:clear()``
Fills the whole clip rectangle with ``CLEAR_PEN``, and returns *self*.
@@ -2981,7 +3108,7 @@ coordinates, and tracks current cursor position and current pen.
* ``painter:tile([char, tile[, ...]])``
- Like above, but also allows overriding the ``tile`` property on ad-hoc basis.
+ Like ``char()`` above, but also allows overriding the ``tile`` property on ad-hoc basis.
* ``painter:string(text[, ...])``
@@ -2991,7 +3118,13 @@ coordinates, and tracks current cursor position and current pen.
Paints the description of the keycode using ``dfhack.pen.parse(cur_key_pen,...)``; returns *self*.
-As noted above, all painting methods return *self*, in order to allow chaining them like this::
+* ``painter:key_string(keycode, text, ...)``
+
+ A convenience wrapper around both ``key()`` and ``string()`` that prints both
+ the specified keycode description and text, separated by ``:``. Any extra
+ arguments are passed directly to ``string()``. Returns *self*.
+
+Unless specified otherwise above, all Painter methods return *self*, in order to allow chaining them like this::
painter:pen(foo):seek(x,y):char(1):advance(1):string('bar')...
@@ -3112,6 +3245,8 @@ The class has the following methods:
Returns *true* if any of the subviews handled the event.
+.. _lua-gui-screen:
+
Screen class
------------
@@ -3543,17 +3678,27 @@ Plugins
.. contents::
:local:
-DFHack plugins may export native functions and events
-to lua contexts. They are automatically imported by
-``mkmodule('plugins.')``; this means that a lua
-module file is still necessary for ``require`` to read.
+DFHack plugins may export native functions and events to Lua contexts. These are
+exposed as ``plugins.`` modules, which can be imported with
+``require('plugins.')``. The plugins listed in this section expose
+functions and/or data to Lua in this way.
+
+In addition to any native functions documented here, plugins that can be
+enabled (that is, plugins that support the `enable/disable API `) will
+have the following functions defined:
-The following plugins have lua support.
+* ``isEnabled()`` returns whether the plugin is enabled.
+* ``setEnabled(boolean)`` sets whether the plugin is enabled.
+
+For plugin developers, note that a Lua file in ``plugins/lua`` is required for
+``require()`` to work, even if it contains no pure-Lua functions. This file must
+contain ``mkmodule('plugins.')`` to import any native functions defined in
+the plugin. See existing files in ``plugins/lua`` for examples.
blueprint
=========
-Native functions:
+Native functions provided by the `blueprint` plugin:
* ``dig(start, end, name)``
* ``build(start, end, name)``
@@ -3563,10 +3708,104 @@ Native functions:
``start`` and ``end`` are tables containing positions (see
``xyz2pos``). ``name`` is used as the basis for the filename.
+.. _building-hacks:
+
+building-hacks
+==============
+
+This plugin overwrites some methods in workshop df class so that mechanical workshops are possible. Although
+plugin export a function it's recommended to use lua decorated function.
+
+.. contents::
+ :local:
+
+Functions
+---------
+
+``registerBuilding(table)`` where table must contain name, as a workshop raw name, the rest are optional:
+
+ :name:
+ custom workshop id e.g. ``SOAPMAKER``
+
+ .. note:: this is the only mandatory field.
+
+ :fix_impassible:
+ if true make impassible tiles impassible to liquids too
+ :consume:
+ how much machine power is needed to work.
+ Disables reactions if not supplied enough and ``needs_power==1``
+ :produce:
+ how much machine power is produced.
+ :needs_power:
+ if produced in network < consumed stop working, default true
+ :gears:
+ a table or ``{x=?,y=?}`` of connection points for machines.
+ :action:
+ a table of number (how much ticks to skip) and a function which
+ gets called on shop update
+ :animate:
+ a table of frames which can be a table of:
+
+ a. tables of 4 numbers ``{tile,fore,back,bright}`` OR
+ b. empty table (tile not modified) OR
+ c. ``{x= y= + 4 numbers like in first case}``,
+ this generates full frame useful for animations that change little (1-2 tiles)
+
+ :canBeRoomSubset:
+ a flag if this building can be counted in room. 1 means it can, 0 means it can't and -1 default building behaviour
+ :auto_gears:
+ a flag that automatically fills up gears and animate. It looks over building definition for gear icons and maps them.
+
+ Animate table also might contain:
+
+ :frameLength:
+ how many ticks does one frame take OR
+ :isMechanical:
+ a bool that says to try to match to mechanical system (i.e. how gears are turning)
+
+``getPower(building)`` returns two number - produced and consumed power if building can be modified and returns nothing otherwise
+
+``setPower(building,produced,consumed)`` sets current productiona and consumption for a building.
+
+Examples
+--------
+
+Simple mechanical workshop::
+
+ require('plugins.building-hacks').registerBuilding{name="BONE_GRINDER",
+ consume=15,
+ gears={x=0,y=0}, --connection point
+ animate={
+ isMechanical=true, --animate the same conn. point as vanilla gear
+ frames={
+ {{x=0,y=0,42,7,0,0}}, --first frame, 1 changed tile
+ {{x=0,y=0,15,7,0,0}} -- second frame, same
+ }
+ }
+
+Or with auto_gears::
+
+ require('plugins.building-hacks').registerBuilding{name="BONE_GRINDER",
+ consume=15,
+ auto_gears=true
+ }
+
+buildingplan
+============
+
+Native functions provided by the `buildingplan` plugin:
+
+* ``bool isPlannableBuilding(df::building_type type, int16_t subtype, int32_t custom)`` returns whether the building type is handled by buildingplan.
+* ``bool isPlanModeEnabled(df::building_type type, int16_t subtype, int32_t custom)`` returns whether the buildingplan UI is enabled for the specified building type.
+* ``bool isPlannedBuilding(df::building *bld)`` returns whether the given building is managed by buildingplan.
+* ``void addPlannedBuilding(df::building *bld)`` suspends the building jobs and adds the building to the monitor list.
+* ``void doCycle()`` runs a check for whether buildlings in the monitor list can be assigned items and unsuspended. This method runs automatically twice a game day, so you only need to call it directly if you want buildingplan to do a check right now.
+* ``void scheduleCycle()`` schedules a cycle to be run during the next non-paused game frame. Can be called multiple times while the game is paused and only one cycle will be scheduled.
+
burrows
=======
-Implements extended burrow manipulations.
+The `burrows` plugin implements extended burrow manipulations.
Events:
@@ -3608,20 +3847,142 @@ Native functions:
The lua module file also re-exports functions from ``dfhack.burrows``.
-sort
-====
+.. _cxxrandom:
+
+cxxrandom
+=========
+
+Exposes some features of the C++11 random number library to Lua.
+
+.. contents::
+ :local:
+
+Native functions (exported to Lua)
+----------------------------------
+
+- ``GenerateEngine(seed)``
+
+ returns engine id
+
+- ``DestroyEngine(rngID)``
+
+ destroys corresponding engine
+
+- ``NewSeed(rngID, seed)``
+
+ re-seeds engine
+
+- ``rollInt(rngID, min, max)``
+
+ generates random integer
+
+- ``rollDouble(rngID, min, max)``
+
+ generates random double
+
+- ``rollNormal(rngID, avg, stddev)``
+
+ generates random normal[gaus.]
+
+- ``rollBool(rngID, chance)``
+
+ generates random boolean
+
+- ``MakeNumSequence(start, end)``
+
+ returns sequence id
+
+- ``AddToSequence(seqID, num)``
+
+ adds a number to the sequence
+
+- ``ShuffleSequence(rngID, seqID)``
+
+ shuffles the number sequence
+
+- ``NextInSequence(seqID)``
+
+ returns the next number in sequence
+
+
+Lua plugin functions
+--------------------
+
+- ``MakeNewEngine(seed)``
+
+ returns engine id
+
+Lua plugin classes
+------------------
+
+``crng``
+~~~~~~~~
+
+- ``init(id, df, dist)``: constructor
+
+ - ``id``: Reference ID of engine to use in RNGenerations
+ - ``df`` (optional): bool indicating whether to destroy the Engine when the crng object is garbage collected
+ - ``dist`` (optional): lua number distribution to use
+
+- ``changeSeed(seed)``: alters engine's seed value
+- ``setNumDistrib(distrib)``: sets the number distribution crng object should use
+
+ - ``distrib``: number distribution object to use in RNGenerations
+
+- ``next()``: returns the next number in the distribution
+- ``shuffle()``: effectively shuffles the number distribution
+
+``normal_distribution``
+~~~~~~~~~~~~~~~~~~~~~~~
+
+- ``init(avg, stddev)``: constructor
+- ``next(id)``: returns next number in the distribution
+
+ - ``id``: engine ID to pass to native function
+
+``real_distribution``
+~~~~~~~~~~~~~~~~~~~~~
+
+- ``init(min, max)``: constructor
+- ``next(id)``: returns next number in the distribution
+
+ - ``id``: engine ID to pass to native function
+
+``int_distribution``
+~~~~~~~~~~~~~~~~~~~~
-Does not export any native functions as of now. Instead, it
-calls lua code to perform the actual ordering of list items.
+- ``init(min, max)``: constructor
+- ``next(id)``: returns next number in the distribution
+
+ - ``id``: engine ID to pass to native function
+
+``bool_distribution``
+~~~~~~~~~~~~~~~~~~~~~
+
+- ``init(min, max)``: constructor
+- ``next(id)``: returns next boolean in the distribution
+
+ - ``id``: engine ID to pass to native function
+
+``num_sequence``
+~~~~~~~~~~~~~~~~
+
+- ``init(a, b)``: constructor
+- ``add(num)``: adds num to the end of the number sequence
+- ``shuffle()``: shuffles the sequence of numbers
+- ``next()``: returns next number in the sequence
.. _eventful:
-Eventful
+eventful
========
This plugin exports some events to lua thus allowing to run lua functions
on DF world events.
+.. contents::
+ :local:
+
List of events
--------------
@@ -3774,93 +4135,17 @@ Integrated tannery::
b=require "plugins.eventful"
b.addReactionToShop("TAN_A_HIDE","LEATHERWORKS")
-.. _building-hacks:
-
-Building-hacks
-==============
-
-This plugin overwrites some methods in workshop df class so that mechanical workshops are possible. Although
-plugin export a function it's recommended to use lua decorated function.
-
-Functions
----------
-
-``registerBuilding(table)`` where table must contain name, as a workshop raw name, the rest are optional:
-
- :name:
- custom workshop id e.g. ``SOAPMAKER``
-
- .. note:: this is the only mandatory field.
-
- :fix_impassible:
- if true make impassible tiles impassible to liquids too
- :consume:
- how much machine power is needed to work.
- Disables reactions if not supplied enough and ``needs_power==1``
- :produce:
- how much machine power is produced.
- :needs_power:
- if produced in network < consumed stop working, default true
- :gears:
- a table or ``{x=?,y=?}`` of connection points for machines.
- :action:
- a table of number (how much ticks to skip) and a function which
- gets called on shop update
- :animate:
- a table of frames which can be a table of:
-
- a. tables of 4 numbers ``{tile,fore,back,bright}`` OR
- b. empty table (tile not modified) OR
- c. ``{x= y= + 4 numbers like in first case}``,
- this generates full frame useful for animations that change little (1-2 tiles)
-
- :canBeRoomSubset:
- a flag if this building can be counted in room. 1 means it can, 0 means it can't and -1 default building behaviour
- :auto_gears:
- a flag that automatically fills up gears and animate. It looks over building definition for gear icons and maps them.
-
- Animate table also might contain:
-
- :frameLength:
- how many ticks does one frame take OR
- :isMechanical:
- a bool that says to try to match to mechanical system (i.e. how gears are turning)
-
-``getPower(building)`` returns two number - produced and consumed power if building can be modified and returns nothing otherwise
-
-``setPower(building,produced,consumed)`` sets current productiona and consumption for a building.
-
-Examples
---------
-
-Simple mechanical workshop::
-
- require('plugins.building-hacks').registerBuilding{name="BONE_GRINDER",
- consume=15,
- gears={x=0,y=0}, --connection point
- animate={
- isMechanical=true, --animate the same conn. point as vanilla gear
- frames={
- {{x=0,y=0,42,7,0,0}}, --first frame, 1 changed tile
- {{x=0,y=0,15,7,0,0}} -- second frame, same
- }
- }
-
-Or with auto_gears::
-
- require('plugins.building-hacks').registerBuilding{name="BONE_GRINDER",
- consume=15,
- auto_gears=true
- }
-
.. _luasocket:
-Luasocket
+luasocket
=========
A way to access csocket from lua. The usage is made similar to luasocket in vanilla lua distributions. Currently
only subset of functions exist and only tcp mode is implemented.
+.. contents::
+ :local:
+
Socket class
------------
@@ -3926,8 +4211,9 @@ A class with all the tcp functionality.
map-render
==========
-A way to ask df to render a slice of map. This uses native df rendering function so it's highly dependant on
-df settings (e.g. used tileset, colors, if using graphics or not and so on...)
+A way to ask DF to render a section of the fortress mode map. This uses a native
+DF rendering function so it's highly dependent on DF settings (e.g. tileset,
+colors, etc.)
Functions
---------
@@ -3936,203 +4222,241 @@ Functions
returns a table with w*h*4 entries of rendered tiles. The format is same as ``df.global.gps.screen`` (tile,foreground,bright,background).
-.. _cxxrandom:
-
-cxxrandom
-=========
-
-Exposes some features of the C++11 random number library to Lua.
-
-Native functions (exported to Lua)
-----------------------------------
-
-- ``GenerateEngine(seed)``
-
- returns engine id
-
-- ``DestroyEngine(rngID)``
-
- destroys corresponding engine
-
-- ``NewSeed(rngID, seed)``
-
- re-seeds engine
-
-- ``rollInt(rngID, min, max)``
-
- generates random integer
+.. _pathable:
-- ``rollDouble(rngID, min, max)``
-
- generates random double
-
-- ``rollNormal(rngID, avg, stddev)``
+pathable
+========
- generates random normal[gaus.]
+This plugin implements the back end of the `gui/pathable` script. It exports a
+single Lua function, in ``hack/lua/plugins/pathable.lua``:
-- ``rollBool(rngID, chance)``
+* ``paintScreen(cursor[,skip_unrevealed])``: Paint each visible of the screen
+ green or red, depending on whether it can be pathed to from the tile at
+ ``cursor``. If ``skip_unrevealed`` is specified and true, do not draw
+ unrevealed tiles.
- generates random boolean
+sort
+====
-- ``MakeNumSequence(start, end)``
+The `sort ` plugin does not export any native functions as of now.
+Instead, it calls Lua code to perform the actual ordering of list items.
- returns sequence id
+.. _xlsxreader:
-- ``AddToSequence(seqID, num)``
+xlsxreader
+==========
- adds a number to the sequence
+Utility functions to facilitate reading .xlsx spreadsheets. It provides the
+following API methods:
+
+ - ``file_handle open_xlsx_file(filename)``
+ - ``close_xlsx_file(file_handle)``
+ - ``sheet_names list_sheets(file_handle)``
+ - ``sheet_handle open_sheet(file_handle, sheet_name)``
+ - ``close_sheet(sheet_handle)``
+ - ``cell_strings get_row(sheet_handle)``
+
+ Example::
+
+ local xlsxreader = require('plugins.xlsxreader')
+
+ local function dump_sheet(xlsx_file, sheet_name)
+ print('reading sheet: '..sheet_name)
+ local xlsx_sheet = xlsxreader.open_sheet(xlsx_file, sheet_name)
+ dfhack.with_finalize(
+ function () xlsxreader.close_sheet(xlsx_sheet) end,
+ function ()
+ local row_cells = xlsxreader.get_row(xlsx_sheet)
+ while row_cells do
+ printall(row_cells)
+ row_cells = xlsxreader.get_row(xlsx_sheet)
+ end
+ end
+ )
+ end
-- ``ShuffleSequence(rngID, seqID)``
+ local filepath = "path/to/some_file.xlsx"
+ local xlsx_file = xlsxreader.open_xlsx_file(filepath)
+ dfhack.with_finalize(
+ function () xlsxreader.close_xlsx_file(xlsx_file) end,
+ function ()
+ for _, sheet_name in ipairs(xlsxreader.list_sheets(xlsx_file)) do
+ dump_sheet(xlsx_file, sheet_name)
+ end
+ end
+ )
- shuffles the number sequence
+=======
+Scripts
+=======
-- ``NextInSequence(seqID)``
+.. contents::
+ :local:
- returns the next number in sequence
+Any files with the ``.lua`` extension placed into the :file:`hack/scripts` folder
+are automatically made avaiable as DFHack commands. The command corresponding to
+a script is simply the script's filename, relative to the scripts folder, with
+the extension omitted. For example:
+* :file:`hack/scripts/add-thought.lua` is invoked as ``add-thought``
+* :file:`hack/scripts/gui/teleport.lua` is invoked as ``gui/teleport``
-Lua plugin functions
---------------------
+.. note::
+ Scripts placed in subdirectories can be run as described above, but are not
+ listed by the `ls` command unless ``-a`` is specified. In general, scripts
+ should be placed in subfolders in the following situations:
+
+ * ``devel``: scripts that are intended exclusively for DFHack development,
+ including examples, or scripts that are experimental and unstable
+ * ``fix``: fixes for specific DF issues
+ * ``gui``: GUI front-ends for existing tools (for example, see the
+ relationship between `teleport` and `gui/teleport`)
+ * ``modtools``: scripts that are intended to be run exclusively as part of
+ mods, not directly by end-users (as a rule of thumb: if someone other than
+ a mod developer would want to run a script from the console, it should
+ not be placed in this folder)
+
+Scripts can also be placed in other folders - by default, these include
+:file:`raw/scripts` and :file:`data/save/{region}/raw/scripts`, but additional
+folders can be added (for example, a copy of the
+:source:scripts:`scripts repository <>` for local development). See
+`script-paths` for more information on how to configure this behavior.
+
+If the first line of the script is a one-line comment (starting with ``--``),
+the content of the comment is used by the built-in ``ls`` and ``help`` commands.
+Such a comment is required for every script in the official DFHack repository.
-- ``MakeNewEngine(seed)``
+Scripts are read from disk when run for the first time, or if they have changed
+since the last time they were run.
- returns engine id
+Each script has an isolated environment where global variables set by the script
+are stored. Values of globals persist across script runs in the same DF session.
+See `devel/lua-example` for an example of this behavior. Note that local
+variables do *not* persist.
-Lua plugin classes
-------------------
+Arguments are passed in to the scripts via the ``...`` built-in quasi-variable;
+when the script is called by the DFHack core, they are all guaranteed to be
+non-nil strings.
-``crng``
-~~~~~~~~
+Additional data about how a script is invoked is passed to the script as a
+special ``dfhack_flags`` global, which is unique to each script. This table
+is guaranteed to exist, but individual entries may be present or absent
+depending on how the script was invoked. Flags that are present are described
+in the subsections below.
-- ``init(id, df, dist)``: constructor
+DFHack invokes the scripts in the `core context `; however it
+is possible to call them from any lua code (including from other scripts) in any
+context with ``dfhack.run_script()`` below.
- - ``id``: Reference ID of engine to use in RNGenerations
- - ``df`` (optional): bool indicating whether to destroy the Engine when the crng object is garbage collected
- - ``dist`` (optional): lua number distribution to use
+General script API
+==================
-- ``changeSeed(seed)``: alters engine's seed value
-- ``setNumDistrib(distrib)``: sets the number distribution crng object should use
+* ``dfhack.run_script(name[,args...])``
- - ``distrib``: number distribution object to use in RNGenerations
+ Run a Lua script in hack/scripts/, as if it was started from the DFHack
+ command-line. The ``name`` argument should be the name of the script without
+ its extension, as would be used on the command line.
-- ``next()``: returns the next number in the distribution
-- ``shuffle()``: effectively shuffles the number distribution
+ Note that this function lets Lua errors propagate to the caller.
-``normal_distribution``
-~~~~~~~~~~~~~~~~~~~~~~~
+ To run other types of commands (such as built-in commands, plugin commands, or
+ Ruby scripts), see ``dfhack.run_command()``. Note that this is slightly slower
+ than ``dfhack.run_script()`` for Lua scripts.
-- ``init(avg, stddev)``: constructor
-- ``next(id)``: returns next number in the distribution
+* ``dfhack.script_help([name, [extension]])``
- - ``id``: engine ID to pass to native function
+ Returns the contents of the embedded documentation of the specified script.
+ ``extension`` defaults to "lua", and ``name`` defaults to the name of the
+ script where this function was called. For example, the following can be used
+ to print the current script's help text::
-``real_distribution``
-~~~~~~~~~~~~~~~~~~~~~
+ local args = {...}
+ if args[1] == 'help' then
+ print(script_help())
+ return
+ end
-- ``init(min, max)``: constructor
-- ``next(id)``: returns next number in the distribution
- - ``id``: engine ID to pass to native function
+Importing scripts
+=================
-``int_distribution``
-~~~~~~~~~~~~~~~~~~~~
+* ``dfhack.reqscript(name)`` or ``reqscript(name)``
-- ``init(min, max)``: constructor
-- ``next(id)``: returns next number in the distribution
+ Loads a Lua script and returns its environment (i.e. a table of all global
+ functions and variables). This is similar to the built-in ``require()``, but
+ searches all script paths for the first matching ``name.lua`` file instead
+ of searching the Lua library paths (like ``hack/lua``).
- - ``id``: engine ID to pass to native function
+ Most scripts can be made to support ``reqscript()`` without significant
+ changes (in contrast, ``require()`` requires the use of ``mkmodule()`` and
+ some additional boilerplate). However, because scripts can have side effects
+ when they are loaded (such as printing messages or modifying the game state),
+ scripts that intend to support being imported must satisfy some criteria to
+ ensure that they can be imported safely:
-``bool_distribution``
-~~~~~~~~~~~~~~~~~~~~~
+ 1. Include the following line - ``reqscript()`` will fail if this line is
+ not present::
-- ``init(min, max)``: constructor
-- ``next(id)``: returns next boolean in the distribution
+ --@ module = true
- - ``id``: engine ID to pass to native function
+ 2. Include a check for ``dfhack_flags.module``, and avoid running any code
+ that has side-effects if this flag is true. For instance::
-``num_sequence``
-~~~~~~~~~~~~~~~~
+ -- (function definitions)
+ if dfhack_flags.module then
+ return
+ end
+ -- (main script code with side-effects)
-- ``init(a, b)``: constructor
-- ``add(num)``: adds num to the end of the number sequence
-- ``shuffle()``: shuffles the sequence of numbers
-- ``next()``: returns next number in the sequence
+ or::
-=======
-Scripts
-=======
+ -- (function definitions)
+ function main()
+ -- (main script code with side-effects)
+ end
+ if not dfhack_flags.module then
+ main()
+ end
-.. contents::
- :local:
+ Example usage::
-Any files with the .lua extension placed into :file:`hack/scripts/*`
-are automatically used by the DFHack core as commands. The
-matching command name consists of the name of the file without
-the extension. First DFHack searches for the script in the :file:`/raw/scripts/` folder. If it is not found there, it searches in the :file:`/raw/scripts/` folder. If it is not there, it searches in
-:file:`/hack/scripts/`. If it is not there, it gives up.
+ local addThought = reqscript('add-thought')
+ addThought.addEmotionToUnit(unit, ...)
-If the first line of the script is a one-line comment, it is
-used by the built-in ``ls`` and ``help`` commands.
-Such a comment is required for every script in the official DFHack repository.
+ Circular dependencies between scripts are supported, as long as the scripts
+ have no side-effects at load time (which should already be the case per
+ the above criteria).
-.. note::
- Scripts placed in subdirectories still can be accessed, but
- do not clutter the `ls` command list (unless ``ls -a``; thus it is preferred
- for obscure developer-oriented scripts and scripts used by tools.
- When calling such scripts, always use '/' as the separator for
- directories, e.g. ``devel/lua-example``.
-
-Scripts are re-read from disk if they have changed since the last time they were read.
-Global variable values persist in memory between calls, unless the file has changed.
-Every script gets its own separate environment for global
-variables.
+ .. warning::
-Arguments are passed in to the scripts via the **...** built-in
-quasi-variable; when the script is called by the DFHack core,
-they are all guaranteed to be non-nil strings.
+ Avoid caching the table returned by ``reqscript()`` beyond storing it in
+ a local or global variable as in the example above. ``reqscript()`` is fast
+ for scripts that have previously been loaded and haven't changed. If you
+ retain a reference to a table returned by an old ``reqscript()`` call, this
+ may lead to unintended behavior if the location of the script changes
+ (e.g. if a save is loaded or unloaded, or if a `script path `
+ is added in some other way).
-DFHack core invokes the scripts in the *core context* (see above);
-however it is possible to call them from any lua code (including
-from other scripts) in any context, via the same function the core uses:
+ .. admonition:: Tip
-* ``dfhack.run_script(name[,args...])``
+ Mods that include custom Lua modules can write these modules to support
+ ``reqscript()`` and distribute them as scripts in ``raw/scripts``. Since the
+ entire ``raw`` folder is copied into new saves, this will allow saves to be
+ successfully transferred to other users who do not have the mod installed
+ (as long as they have DFHack installed).
- Run a lua script in hack/scripts/, as if it was started from dfhack command-line.
- The ``name`` argument should be the name stem, as would be used on the command line.
+ .. admonition:: Backwards compatibility notes
-Note that this function lets errors propagate to the caller.
+ For backwards compatibility, ``moduleMode`` is also defined if
+ ``dfhack_flags.module`` is defined, and is set to the same value.
+ Support for this may be removed in a future version.
* ``dfhack.script_environment(name)``
- Run an Lua script and return its environment.
- This command allows you to use scripts like modules for increased portability.
- It is highly recommended that if you are a modder you put your custom modules in ``raw/scripts`` and use ``script_environment`` instead of ``require`` so that saves with your mod installed will be self-contained and can be transferred to people who do have DFHack but do not have your mod installed.
-
- You can say ``dfhack.script_environment('add-thought').addEmotionToUnit([arguments go here])`` and it will have the desired effect.
- It will call the script in question with the global ``moduleMode`` set to ``true`` so that the script can return early.
- This is useful because if the script is called from the console it should deal with its console arguments and if it is called by ``script_environment`` it should only create its global functions and return.
- You can also access global variables with, for example ``print(dfhack.script_environment('add-thought').validArgs)``
-
- The function ``script_environment`` is fast enough that it is recommended that you not store its result in a nonlocal variable, because your script might need to load a different version of that script if the save is unloaded and a save with a different mod that overrides the same script with a slightly different functionality is loaded.
- This will not be an issue in most cases.
-
- This function also permits circular dependencies of scripts.
-
-* ``dfhack.reqscript(name)`` or ``reqscript(name)``
-
- Nearly identical to script_environment() but requires scripts being loaded to
- include a line similar to::
-
- --@ module = true
-
- This is intended to only allow scripts that take appropriate action when used
- as a module to be loaded.
-
-* ``dfhack.script_help([name, [extension]])``
-
- Returns the contents of the embedded documentation of the specified script.
- ``extension`` defaults to "lua", and ``name`` defaults to the name of the
- script where this function was called.
+ Similar to ``reqscript()`` but does not enforce the check for module support.
+ This can be used to import scripts that support being used as a module but do
+ not declare support as described above, although it is preferred to update
+ such scripts so that ``reqscript()`` can be used instead.
Enabling and disabling scripts
==============================
@@ -4142,11 +4466,23 @@ by including the following line anywhere in their file::
--@ enable = true
-When the ``enable`` and ``disable`` commands are invoked, a ``dfhack_flags``
-table will be passed to the script with the following fields set:
+When the ``enable`` and ``disable`` commands are invoked, the ``dfhack_flags``
+table passed to the script will have the following fields set:
+
+* ``enable``: Always ``true`` if the script is being enabled *or* disabled
+* ``enable_state``: ``true`` if the script is being enabled, ``false`` otherwise
-* ``enable``: Always true if the script is being enabled *or* disabled
-* ``enable_state``: True if the script is being enabled, false otherwise
+Example usage::
+
+ -- @enable = true
+ -- (function definitions...)
+ if dfhack_flags.enable then
+ if dfhack_flags.enable_state then
+ start()
+ else
+ stop()
+ end
+ end
Save init script
================
diff --git a/docs/Memory-research.rst b/docs/Memory-research.rst
new file mode 100644
index 000000000..9729072f5
--- /dev/null
+++ b/docs/Memory-research.rst
@@ -0,0 +1,162 @@
+.. _memory-research:
+
+###############
+Memory research
+###############
+
+There are a variety of tools that can be used to analyze DF memory - some are
+listed here. Note that some of these may be old and unmaintained. If you aren't
+sure what tool would be best for your purposes, feel free to ask for advice (on
+IRC, Bay12, etc.).
+
+.. contents:: Contents
+ :local:
+
+
+Cross-platform tools
+====================
+
+Ghidra
+------
+
+Ghidra is a cross-platform reverse-engineering framework (written in Java)
+available at https://ghidra-sre.org. It supports analyzing both 32-bit and
+64-bit executables for all supported DF platforms. There are some custom DFHack
+Ghidra scripts available in the `df_misc`_ repo (look for ``.java`` files).
+
+
+IDA Freeware 7.0
+----------------
+
+Available from `Hex-Rays `_.
+Supports analyzing both 32-bit and 64-bit executables for all supported DF platforms.
+Some ``.idc`` scripts for IDA are available in the `df_misc`_ repo.
+
+.. _df_misc: https://github.com/DFHack/df_misc
+
+
+Hopper
+------
+
+Runs on macOS and some Linux distributions; available from https://www.hopperapp.com/.
+`TWBT `_ uses this to produce some patches.
+
+
+DFHack tools
+------------
+
+Plugins
+~~~~~~~
+
+There are a few development plugins useful for low-level memory research. They
+are not built by default, but can be built by setting the ``BUILD_DEVEL``
+`CMake option `. These include:
+
+- ``check-structures-sanity``, which performs sanity checks on the given DF
+ object. Note that this will crash in several cases, some intentional, so using
+ this with `GDB ` is recommended.
+- ``memview``, which produces a hex dump of a given memory range. It also
+ highlights valid pointers, and can be configured to work with `sizecheck`
+ to auto-detect object sizes.
+- ``vectors``, which can identify instances of ``std::vector`` in a given memory range.
+
+Scripts
+~~~~~~~
+
+Several `development scripts ` can be useful for memory research.
+These include (but are not limited to):
+
+- `devel/dump-offsets`
+- `devel/find-offsets`
+- `devel/lsmem`
+- `devel/sc` (requires `sizecheck`)
+- `devel/visualize-structure`
+- Generally, any script starting with ``devel/find``
+
+.. _sizecheck:
+
+Sizecheck
+~~~~~~~~~
+
+Sizecheck is a custom tool that hooks into the memory allocator and inserts a
+header indicating the size of every object. The corresponding logic to check for
+this header when freeing memory usually works, but is inherently not foolproof.
+You should not count on DF being stable when using this.
+
+DFHack's implementation of sizecheck is currently only tested on Linux, although
+it probably also works on macOS. It can be built with the ``BUILD_SIZECHECK``
+`CMake option `, which produces a ``libsizecheck``
+library installed in the ``hack`` folder. On Linux, passing ``--sc`` as the
+first argument to the ``dfhack`` launcher script will load this library on
+startup. On other platforms, or when passing a different argument to the
+launcher (such as for `linux-gdb`), you will need to preload this library
+manually, by setting ``PRELOAD_LIB`` on Linux (or ``LD_PRELOAD`` if editing the
+``dfhack`` launcher script directly), or by editing the ``dfhack`` launcher
+script and adding the library to ``DYLD_INSERT_LIBRARIES`` on macOS.
+
+There is also an older sizecheck implementation by Mifki available on
+`GitHub `__ (``b.cpp`` is the main
+sizecheck library, and ``win_patch.cpp`` is used for Windows support). To use
+this with other DFHack tools, you will likely need to edit the header's
+magic number to match what is used in `devel/sc` (search for a hexadecimal
+constant starting with ``0x``).
+
+Legacy tools
+~~~~~~~~~~~~
+
+Some very old DFHack tools are available in the `legacy branch on GitHub `_.
+No attempt is made to support these.
+
+
+Linux-specific tools
+====================
+
+.. _linux-gdb:
+
+GDB
+---
+
+`GDB `_ is technically cross-platform, but
+tends to work best on Linux, and DFHack currently only offers support for using
+GDB on 64-bit Linux. To start with GDB, pass ``-g`` to the DFHack launcher
+script:
+
+.. code-block:: shell
+
+ ./dfhack -g
+
+Some basic GDB commands:
+
+- ``run``: starts DF from the GDB prompt. Any arguments will be passed as
+ command-line arguments to DF (e.g. `load-save` may be useful).
+- ``bt`` will produce a backtrace if DF crashes.
+
+See the `official GDB documentation `_
+for more details.
+
+Other analysis tools
+--------------------
+
+The ``dfhack`` launcher script on Linux has support for launching several other
+tools alongside DFHack, including Valgrind (as well as Callgrind and Helgrind)
+and strace. See the script for the exact command-line option to specify. Note
+that currently only one tool at a time is supported, and must be specified
+with the first argument to the script.
+
+df-structures GUI
+-----------------
+
+This is a tool written by Angavrilov and available on `GitHub `__.
+It only supports 32-bit DF. Some assistance may be available on IRC.
+
+
+EDB (Evan's debugger)
+---------------------
+
+Available on `GitHub `__.
+
+
+Windows-specific tools
+======================
+
+Some people have used `Cheat Engine `__ for research in the past.
diff --git a/docs/NEWS-dev.rst b/docs/NEWS-dev.rst
index 7a9da7cb7..f0c47fe96 100644
--- a/docs/NEWS-dev.rst
+++ b/docs/NEWS-dev.rst
@@ -13,7 +13,8 @@ which they first appeared. See `build-changelog` for more information.
See `changelog` for a list of changes grouped by stable releases.
-.. contents::
- :depth: 2
+.. contents:: Contents
+ :local:
+ :depth: 1
.. include:: /docs/_auto/news-dev.rst
diff --git a/docs/NEWS.rst b/docs/NEWS.rst
index 22f9881b9..1283b079a 100644
--- a/docs/NEWS.rst
+++ b/docs/NEWS.rst
@@ -13,14 +13,15 @@ appeared. See `build-changelog` for more information.
See `dev-changelog` for a list of changes grouped by development releases.
-.. contents::
- :depth: 2
+.. contents:: Contents
+ :local:
+ :depth: 1
.. include:: /docs/_auto/news.rst
Older Changelogs
================
-Are kept in a seperate file: `HISTORY`
+Are kept in a seperate file: `History`
-.. that's ``docs/history.rst``, if you're reading the raw text.
+.. that's ``docs/History.rst``, if you're reading the raw text.
diff --git a/docs/Plugins.rst b/docs/Plugins.rst
index ac1f7dae8..73c0e1073 100644
--- a/docs/Plugins.rst
+++ b/docs/Plugins.rst
@@ -1,3 +1,5 @@
+.. _plugins-index:
+
##############
DFHack Plugins
##############
@@ -9,8 +11,9 @@ game subsystems or the entire renderer.
Most commands offered by plugins are listed here,
hopefully organised in a way you will find useful.
-.. contents::
- :depth: 3
+.. contents:: Contents
+ :local:
+ :depth: 2
===============================
Data inspection and visualizers
@@ -34,7 +37,9 @@ For more information, see `the full Stonesense README `.
blueprint
=========
-Exports a portion of your fortress into QuickFort style blueprint files.::
+Exports a portion of your fortress into QuickFort style blueprint files.
+
+Usage::
blueprint [dig] [build] [place] [query]
@@ -56,6 +61,11 @@ remotefortressreader
An in-development plugin for realtime fortress visualisation.
See :forums:`Armok Vision <146473>`.
+.. _isoworldremote:
+
+isoworldremote
+==============
+A plugin that implements a `remote API ` used by Isoworld.
.. _cursecheck:
@@ -109,24 +119,21 @@ A tool for checking how many tiles contain flowing liquids. If you suspect that
your magma sea leaks into HFS, you can use this tool to be sure without
revealing the map.
-.. _pathable:
-
-pathable
-========
-
-This plugin implements the back end of the `gui/pathable` script. It exports a
-single Lua function, in ``hack/lua/plugins/pathable.lua``:
-
-* ``paintScreen(cursor[,skip_unrevealed])``: Paint each visible of the screen
- green or red, depending on whether it can be pathed to from the tile at
- ``cursor``. If ``skip_unrevealed`` is specified and true, do not draw
- unrevealed tiles.
-
.. _probe:
probe
=====
-Can be used to determine tile properties like temperature.
+
+This plugin provides multiple commands that print low-level properties of the
+selected objects.
+
+* ``probe``: prints some properties of the tile selected with :kbd:`k`. Some of
+ these properties can be passed into `tiletypes`.
+* ``cprobe``: prints some properties of the unit selected with :kbd:`v`, as well
+ as the IDs of any worn items. `gui/gm-unit` and `gui/gm-editor` are more
+ complete in-game alternatives.
+* ``bprobe``: prints some properties of the building selected with :kbd:`q` or
+ :kbd:`t`. `gui/gm-editor` is a more complete in-game alternative.
.. _prospect:
.. _prospector:
@@ -183,7 +190,7 @@ Usage and related commands:
:revflood: Hide everything, then reveal tiles with a path to the cursor
(useful to make walled-off rooms vanish)
:revforget: Discard info about what was visible before revealing the map.
- Only useful where (eg) you abandoned with the fort revealed
+ Only useful where (e.g.) you abandoned with the fort revealed
and no longer want the data.
.. _showmood:
@@ -283,6 +290,8 @@ One-shot subcommands:
Subcommands that persist until disabled or DF quits:
+.. comment: sort these alphabetically
+
:adamantine-cloth-wear: Prevents adamantine clothing from wearing out while being worn (:bug:`6481`).
:advmode-contained: Works around :bug:`6202`, custom reactions with container inputs
in advmode. The issue is that the screen tries to force you to select
@@ -297,6 +306,7 @@ Subcommands that persist until disabled or DF quits:
:craft-age-wear: Fixes the behavior of crafted items wearing out over time (:bug:`6003`).
With this tweak, items made from cloth and leather will gain a level of
wear every 20 years.
+:do-job-now: Adds a job priority toggle to the jobs list
:embark-profile-name: Allows the use of lowercase letters when saving embark profiles
:eggs-fertile: Displays a fertility indicator on nestboxes
:farm-plot-select: Adds "Select all" and "Deselect all" options to farm plot menus
@@ -327,12 +337,15 @@ Subcommands that persist until disabled or DF quits:
i.e. stop the rightmost list of the Positions page of the military
screen from constantly resetting to the top.
:nestbox-color: Fixes the color of built nestboxes
+:reaction-gloves: Fixes reactions to produce gloves in sets with correct handedness (:bug:`6273`)
:shift-8-scroll: Gives Shift-8 (or :kbd:`*`) priority when scrolling menus, instead of scrolling the map
:stable-cursor: Saves the exact cursor position between t/q/k/d/b/etc menus of fortress mode.
:stone-status-all: Adds an option to toggle the economic status of all stones
:title-start-rename: Adds a safe rename option to the title screen "Start Playing" menu
:tradereq-pet-gender: Displays pet genders on the trade request screen
+.. comment: sort these alphabetically
+
.. _fix-armory:
fix-armory
@@ -692,15 +705,45 @@ enabled materials, you should be able to place complex constructions more conven
buildingplan
============
When active (via ``enable buildingplan``), this plugin adds a planning mode for
-furniture placement. You can then place furniture and other buildings before
-the required materials are available, and the job will be unsuspended when
-the item is created.
+building placement. You can then place furniture, constructions, and other buildings
+before the required materials are available, and they will be created in a suspended
+state. Buildingplan will periodically scan for appropriate items, and the jobs will
+be unsuspended when the items are available.
-Very useful when combined with `workflow` - you can set a constraint
+This is very useful when combined with `workflow` - you can set a constraint
to always have one or two doors/beds/tables/chairs/etc available, and place
-as many as you like. The plugins then take over and fulfill the orders,
+as many as you like. The plugins then take over and fulfill the orders,
with minimal space dedicated to stockpiles.
+Item filtering
+--------------
+
+While placing a building, you can set filters for what materials you want the building made
+out of, what quality you want the component items to be, and whether you want the items to
+be decorated.
+
+If a building type takes more than one item to construct, use
+:kbd:`Ctrl`:kbd:`Left` and :kbd:`Ctrl`:kbd:`Right` to select the item that you
+want to set filters for. Any filters that you set will be used for all buildings
+of the selected type from that point onward (until you set a new filter or clear
+the current one).
+
+For example, you can be sure that all your constructed walls are the same color by setting
+a filter to accept only certain types of stone.
+
+Quickfort mode
+--------------
+
+If you use the external Python Quickfort to apply building blueprints instead of the native
+DFHack `quickfort` script, you must enable Quickfort mode. This temporarily enables
+buildingplan for all building types and adds an extra blank screen after every building
+placement. This "dummy" screen is needed for Python Quickfort to interact successfully with
+Dwarf Fortress.
+
+Note that Quickfort mode is only for compatibility with the legacy Python Quickfort. The
+DFHack `quickfort` script does not need Quickfort mode to be enabled. The `quickfort` script
+will successfully integrate with buildingplan as long as the buildingplan plugin is enabled.
+
.. _confirm:
confirm
@@ -728,7 +771,7 @@ by moving the view manually.
mousequery
==========
-Adds mouse controls to the DF interface, eg click-and-drag designations.
+Adds mouse controls to the DF interface, e.g. click-and-drag designations.
Options:
@@ -770,6 +813,7 @@ Adds a :kbd:`q` menu for track stops, which is completely blank by default.
This allows you to view and/or change the track stop's friction and dump
direction settings, using the keybindings from the track stop building interface.
+.. _sort:
.. _sort-items:
sort-items
@@ -831,10 +875,10 @@ See `gui/stockpiles` for an in-game interface.
:savestock: Saves the currently highlighted stockpile's settings to a file in your Dwarf
Fortress folder. This file can be used to copy settings between game saves or
- players. eg: ``savestock food_settings.dfstock``
+ players. e.g.: ``savestock food_settings.dfstock``
:loadstock: Loads a saved stockpile settings file and applies it to the currently selected
- stockpile. eg: ``loadstock food_settings.dfstock``
+ stockpile. e.g.: ``loadstock food_settings.dfstock``
To use savestock and loadstock, use the :kbd:`q` command to highlight a stockpile.
Then run savestock giving it a descriptive filename. Then, in a different (or
@@ -1429,7 +1473,9 @@ can be displayed on the main fortress mode screen:
The file :file:`dfhack-config/dwarfmonitor.json` can be edited to control the
positions and settings of all widgets displayed. This file should contain a
JSON object with the key ``widgets`` containing an array of objects - see the
-included file in the ``dfhack-config`` folder for an example::
+included file in the ``dfhack-config`` folder for an example:
+
+.. code-block:: lua
{
"widgets": [
@@ -1563,6 +1609,8 @@ Options:
:nick: Mass-assign nicknames, must be followed by the name you want
to set.
:remnick: Mass-remove nicknames.
+:enumnick: Assign enumerated nicknames (e.g. "Hen 1", "Hen 2"...). Must be
+ followed by the prefix to use in nicknames.
:tocages: Assign unit(s) to cages inside a pasture.
:uinfo: Print info about unit(s). If no filters are set a unit must
be selected in the in-game ui.
@@ -1925,10 +1973,10 @@ Options:
:L: Low Traffic
:R: Restricted Traffic
-.. _burrow:
+.. _burrows:
-burrow
-======
+burrows
+=======
Miscellaneous burrow control. Allows manipulating burrows and automated burrow
expansion while digging.
@@ -2298,16 +2346,19 @@ by spaces.
Options:
-:``-t``: Select trees only (exclude shrubs)
-:``-s``: Select shrubs only (exclude trees)
-:``-c``: Clear designations instead of setting them
-:``-x``: Apply selected action to all plants except those specified (invert
+:``-t``: Tree: Select trees only (exclude shrubs)
+:``-s``: Shrub: Select shrubs only (exclude trees)
+:``-f``: Farming: Designate only shrubs that yield seeds for farming. Implies -s
+:``-c``: Clear: Clear designations instead of setting them
+:``-x``: eXcept: Apply selected action to all plants except those specified (invert
selection)
-:``-a``: Select every type of plant (obeys ``-t``/``-s``)
-:``-v``: Lists the number of (un)designations per plant
+:``-a``: All: Select every type of plant (obeys ``-t``/``-s``/``-f``)
+:``-v``: Verbose: Lists the number of (un)designations per plant
+:``-n *``: Number: Designate up to * (an integer number) plants of each species
-Specifying both ``-t`` and ``-s`` will have no effect. If no plant IDs are specified,
-all valid plant IDs will be listed.
+Specifying both ``-t`` and ``-s`` or ``-f`` will have no effect. If no plant IDs are
+specified, all valid plant IDs will be listed, with ``-t``, ``-s``, and ``-f``
+restricting the list to trees, shrubs, and farmable shrubs, respectively.
.. note::
@@ -2318,6 +2369,12 @@ all valid plant IDs will be listed.
plant gatherer to walk there and do nothing (except clearing the
designation). See :issue:`1479` for details.
+ The implementation another known deficiency: it's incapable of detecting that
+ raw definitions that specify a seed extraction reaction for the structural part
+ but has no other use for it cannot actually yield any seeds, as the part is
+ never used (parts of :bug:`6940`, e.g. Red Spinach), even though DF
+ collects it, unless there's a workshop reaction to do it (which there isn't
+ in vanilla).
.. _infiniteSky:
@@ -2347,11 +2404,15 @@ dfhack command line and can't be used from a hotkey. Settings will be remembered
as long as dfhack runs. Intended for use in combination with the command
``liquids-here`` (which can be bound to a hotkey). See also :issue:`80`.
-.. note::
+.. warning::
Spawning and deleting liquids can mess up pathing data and
temperatures (creating heat traps). You've been warned.
+.. note::
+
+ `gui/liquids` is an in-game UI for this script.
+
Settings will be remembered until you quit DF. You can call `liquids-here` to execute
the last configured action, which is useful in combination with keybindings.
@@ -2457,7 +2518,8 @@ See also `alltraffic`, `filltraffic`, and `restrictice`.
tiletypes
=========
Can be used for painting map tiles and is an interactive command, much like
-`liquids`. If something goes wrong, `fixveins` may help.
+`liquids`. Some properties of existing tiles can be looked up with `probe`. If
+something goes wrong, `fixveins` may help.
The tool works with two set of options and a brush. The brush determines which
tiles will be processed. First set of options is the filter, which can exclude
@@ -2608,25 +2670,40 @@ Usage:
createitem
==========
-Allows creating new items of arbitrary types and made of arbitrary materials.
-By default, items created are spawned at the feet of the selected unit.
+Allows creating new items of arbitrary types and made of arbitrary materials. A
+unit must be selected in-game to use this command. By default, items created are
+spawned at the feet of the selected unit.
Specify the item and material information as you would indicate them in
custom reaction raws, with the following differences:
* Separate the item and material with a space rather than a colon
-* If the item has no subtype, omit the :NONE
-* If the item is REMAINS, FISH, FISH_RAW, VERMIN, PET, or EGG,
- specify a CREATURE:CASTE pair instead of a material token.
+* If the item has no subtype, the ``:NONE`` can be omitted
+* If the item is ``REMAINS``, ``FISH``, ``FISH_RAW``, ``VERMIN``, ``PET``, or ``EGG``,
+ specify a ``CREATURE:CASTE`` pair instead of a material token.
+* If the item is a ``PLANT_GROWTH``, specify a ``PLANT_ID:GROWTH_ID`` pair
+ instead of a material token.
Corpses, body parts, and prepared meals cannot be created using this tool.
-Examples::
+To obtain the item and material tokens of an existing item, run
+``createitem inspect``. Its output can be passed directly as arguments to
+``createitem`` to create new matching items, as long as the item type is
+supported.
+
+Examples:
+
+* Create 2 pairs of steel gauntlets::
createitem GLOVES:ITEM_GLOVES_GAUNTLETS INORGANIC:STEEL 2
- Create 2 pairs of steel gauntlets.
+
+* Create tower-cap logs::
+
createitem WOOD PLANT_MAT:TOWER_CAP:WOOD
- Create tower-cap logs.
+
+* Create bilberries::
+
+ createitem PLANT_GROWTH BILBERRY:FRUIT
For more examples, :wiki:`see this wiki page `.
@@ -2914,8 +2991,10 @@ Lua API
Some plugins consist solely of native libraries exposed to Lua. They are listed
in the `lua-api` file under `lua-plugins`:
-* `eventful`
* `building-hacks`
+* `cxxrandom`
+* `eventful`
* `luasocket`
* `map-render`
-* `cxxrandom`
+* `pathable`
+* `xlsxreader`
diff --git a/docs/Remote.rst b/docs/Remote.rst
new file mode 100644
index 000000000..435873f71
--- /dev/null
+++ b/docs/Remote.rst
@@ -0,0 +1,233 @@
+.. _remote:
+
+=======================
+DFHack Remote Interface
+=======================
+
+DFHack provides a remote access interface that external tools can connect to and
+use to interact with DF. This is implemented with `Google protobuf`_ messages
+exchanged over a TCP socket. Both the core and plugins can define
+remotely-accessible methods, or **RPC methods**. The RPC methods currently
+available are not comprehensive, but can be extended with plugins.
+
+.. _Google protobuf: https://developers.google.com/protocol-buffers
+
+.. contents:: Contents
+ :local:
+
+
+.. _remote-server-config:
+
+Server configuration
+====================
+
+DFHack attempts to start a TCP server to listen for remote connections on
+startup. If this fails (due to the port being in use, for example), an error
+message will be logged to stderr.log.
+
+The server can be configured by setting options in ``dfhack-config/remote-server.json``:
+
+- ``allow_remote`` (default: ``false``): if true, allows connections from hosts
+ other than the local machine. This is insecure and may allow arbitrary code
+ execution on your machine, so it is disabled by default.
+- ``port`` (default: ``5000``): the port that the remote server listens on.
+ Overriding this will allow the server to work if you have multiple instances
+ of DF running, or if you have something else running on port 5000. Note that
+ the ``DFHACK_PORT`` `environment variable ` takes precedence over
+ this setting and may be more useful for overriding the port temporarily.
+
+
+Developing with the remote API
+==============================
+
+At a high level, the core and plugins define RPC methods, and external clients
+can call these methods. Each method is assigned an ID internally, which clients
+use to call it. These method IDs can be obtained using the special ``BindMethod``
+method, which has an ID of 0.
+
+Examples
+--------
+
+The `dfhack-run` command uses the RPC interface to invoke DFHack commands
+(or Lua functions) externally.
+
+Plugins that implement RPC methods include:
+
+- `rename`
+- `remotefortressreader`
+- `isoworldremote`
+
+Plugins that use the RPC API include:
+
+- `stonesense`
+
+Third-party tools that use the RPC API include:
+
+- `Armok Vision `_ (:forums:`Bay12 forums thread <146473>`)
+
+Client libraries
+----------------
+
+Some external libraries are available for interacting with the remote interface
+from other (non-C++) languages, including:
+
+- `RemoteClientDF-Net `_ for C#
+- `dfhackrpc `_ for Go
+- `dfhack-remote `_ for JavaScript
+
+
+Protocol description
+====================
+
+This is a low-level description of the RPC protocol, which may be useful when
+developing custom clients.
+
+A WireShark dissector for this protocol is available in the
+`df_misc repo `_.
+
+
+Built-in messages
+-----------------
+These messages have hardcoded IDs; all others must be obtained through ``BindMethod``.
+
+=== ============ =============================== =======================
+ID Method Input Output
+=== ============ =============================== =======================
+ 0 BindMethod dfproto.CoreBindRequest dfproto.CoreBindReply
+ 1 RunCommand dfproto.CoreRunCommandRequest dfproto.EmptyMessage
+=== ============ =============================== =======================
+
+
+
+Conversation flow
+-----------------
+
+* Client → Server: `handshake request`_
+* Server → Client: `handshake reply`_
+* Repeated 0 or more times:
+ * Client → Server: `request`_
+ * Server → Client: `text`_ (0 or more times)
+ * Server → Client: `result`_ or `failure`_
+* Client → Server: `quit`_
+
+Raw message types
+-----------------
+
+* All numbers are little-endian
+* All strings are ASCII
+* A payload size of greater than 64MiB is an error
+* See ``RemoteClient.h`` for definitions of constants starting with ``RPC``
+
+handshake request
+~~~~~~~~~~~~~~~~~
+
+.. csv-table::
+ :align: left
+ :header-rows: 1
+
+ Type, Name, Value
+ char[8], magic, ``DFHack?\n``
+ int32_t, version, 1
+
+handshake reply
+~~~~~~~~~~~~~~~
+
+.. csv-table::
+ :align: left
+ :header-rows: 1
+
+ Type, Name, Value
+ char[8], magic, ``DFHack!\n``
+ int32_t, version, 1
+
+header
+~~~~~~
+
+**Note:** the two fields of this message are sometimes repurposed. Uses of this
+message are represented as ``header(x, y)``, where ``x`` corresponds to the ``id``
+field and ``y`` corresponds to ``size``.
+
+.. csv-table::
+ :align: left
+ :header-rows: 1
+
+ Type, Name
+ int16_t, id
+ int16_t, (padding - unused)
+ int32_t, size
+
+request
+~~~~~~~
+
+.. list-table::
+ :align: left
+ :header-rows: 1
+ :widths: 25 75
+
+ * - Type
+ - Description
+ * - `header`_
+ - ``header(id, size)``
+ * - buffer
+ - Protobuf-encoded payload of the input message type of the method specified by ``id``; length of ``size`` bytes
+
+text
+~~~~
+
+.. list-table::
+ :align: left
+ :header-rows: 1
+ :widths: 25 75
+
+ * - Type
+ - Description
+ * - `header`_
+ - ``header(RPC_REPLY_TEXT, size)``
+ * - buffer
+ - Protobuf-encoded payload of type ``dfproto.CoreTextNotification``; length of ``size`` bytes
+
+result
+~~~~~~
+
+.. list-table::
+ :align: left
+ :header-rows: 1
+ :widths: 25 75
+
+ * - Type
+ - Description
+ * - `header`_
+ - ``header(RPC_REPLY_RESULT, size)``
+ * - buffer
+ - Protobuf-encoded payload of the output message type of the oldest incomplete method call; when received,
+ that method call is considered completed. Length of ``size`` bytes.
+
+failure
+~~~~~~~
+
+.. list-table::
+ :align: left
+ :header-rows: 1
+ :widths: 25 75
+
+ * - Type
+ - Description
+ * - `header`_
+ - ``header(RPC_REPLY_FAIL, command_result)``
+ * - command_result
+ - return code of the command (a constant starting with ``CR_``; see ``RemoteClient.h``)
+
+quit
+~~~~
+
+**Note:** the server closes the connection after receiving this message.
+
+.. list-table::
+ :align: left
+ :header-rows: 1
+ :widths: 25 75
+
+ * - Type
+ - Description
+ * - `header`_
+ - ``header(RPC_REQUEST_QUIT, 0)``
diff --git a/docs/Removed.rst b/docs/Removed.rst
new file mode 100644
index 000000000..f98915bdd
--- /dev/null
+++ b/docs/Removed.rst
@@ -0,0 +1,17 @@
+#############
+Removed tools
+#############
+
+This page lists tools (plugins or scripts) that were previously included in
+DFHack but have been removed. It exists primarily so that internal links still
+work (e.g. links from the `changelog`).
+
+.. contents:: Contents
+ :local:
+ :depth: 1
+
+.. _warn-stuck-trees:
+
+warn-stuck-trees
+================
+The corresponding DF bug, :bug:`9252` was fixed in DF 0.44.01.
diff --git a/docs/Scripts-removed.rst b/docs/Scripts-removed.rst
deleted file mode 100644
index 4490110ba..000000000
--- a/docs/Scripts-removed.rst
+++ /dev/null
@@ -1,14 +0,0 @@
-###############
-Removed scripts
-###############
-
-The following scripts were removed for various reasons.
-
-.. contents::
- :depth: 2
-
-.. _warn-stuck-trees:
-
-warn-stuck-trees
-================
-The corresponding DF bug, :bug:`9252` was fixed in DF 0.44.01.
diff --git a/docs/Scripts.rst b/docs/Scripts.rst
index 0e6ef415c..419385582 100644
--- a/docs/Scripts.rst
+++ b/docs/Scripts.rst
@@ -1,3 +1,5 @@
+.. _scripts-index:
+
##############
DFHack Scripts
##############
diff --git a/docs/Structures-intro.rst b/docs/Structures-intro.rst
new file mode 100644
index 000000000..c45d03eaf
--- /dev/null
+++ b/docs/Structures-intro.rst
@@ -0,0 +1,34 @@
+===================================
+DF data definitions (DF-structures)
+===================================
+
+DFHack's information about DF's data structures is stored in XML files in the
+`df-structures repository `_. If you
+have `obtained a local copy of the DFHack source `,
+DF-structures is included as a submodule in ``library/xml``.
+
+Data structure layouts are described in files named with the ``df.*.xml``
+pattern. This information is transformed by a Perl script (``codegen.pl``) into
+C++ headers, as well as metadata for the Lua wrapper. This ultimately allows
+DFHack code to access DF data directly, with the same speed and capabilities as
+DF itself, which is an advantage over the older out-of-process approach (used
+by debuggers and utilities like Dwarf Therapist). The main disadvantage of this
+approach is that any compiled code relying on these layouts will break when DF's
+layout changes, and will need to be recompiled for every new DF version.
+
+Addresses of DF global objects and vtables are stored in a separate file,
+:file:`symbols.xml`. Since these are only absolute addresses, they do not need
+to be compiled in to DFHack code, and are instead loaded at runtime. This makes
+fixes and additions to global addresses possible without recompiling DFHack.
+In an installed copy of DFHack, this file can be found at the root of the
+``hack`` folder.
+
+The following pages contain more detailed information about various aspects
+of DF-structures:
+
+.. toctree::
+ :titlesonly:
+
+ /library/xml/SYNTAX
+ /library/xml/how-to-update
+
diff --git a/docs/api/Maps.rst b/docs/api/Maps.rst
new file mode 100644
index 000000000..cfffe7905
--- /dev/null
+++ b/docs/api/Maps.rst
@@ -0,0 +1,59 @@
+.. include::
+
+========
+Maps API
+========
+
+DFHack offers several ways to access and manipulate map data.
+
+* C++: the ``Maps`` and ``MapCache`` modules
+* Lua: the `dfhack.maps module `_
+* All languages: the ``map`` field of the ``world`` global contains raw map data
+ when the world is loaded.
+
+.. note::
+
+ This page will eventually go into more detail about the available APIs.
+ For now, it is just an overview of how DF map data is structured.
+
+.. contents:: Contents
+ :local:
+
+Tiles
+=====
+
+The DF map has several types of tiles:
+
+- **Local tiles** are at the smallest scale. In regular fortress/adventure mode
+ play, the cursor takes up 1 local tile.
+
+ Objects that use local tile coordinates include:
+
+ - Units
+ - Items
+ - Projectiles
+
+- **Blocks** are 16 |times| 16 |times| 1 groups of local tiles. Internally, many
+ tile details are stored at the block level for space-efficiency reasons.
+ Blocks are visible during zoomed-in fast travel in adventure mode.
+
+ Objects that use block coordinates include:
+
+ - Armies
+
+- **Region tiles** are 3 |times| 3 groups of columns of blocks (they span the
+ entire z-axis), or 48 |times| 48 columns of local tiles. DF sometimes refers
+ to these as "mid-level tiles" (MLTs). Region tiles are visible when resizing
+ a fortress before embarking, or in zoomed-out fast travel in adventure mode.
+
+- **World tiles** are
+
+ - 16 |times| 16 groups of region tiles, or
+ - 48 |times| 48 groups of columns of blocks, or
+ - 768 |times| 768 groups of columns of local tiles
+
+ World tiles are visible on the world map before embarking, as well as in the
+ civilization map in fortress mode and the quest log in adventure mode.
+
+- Some map features are stored in 16 |times| 16 groups of world tiles, sometimes
+ referred to as "feature shells".
diff --git a/docs/api/index.rst b/docs/api/index.rst
new file mode 100644
index 000000000..1fe03e9a8
--- /dev/null
+++ b/docs/api/index.rst
@@ -0,0 +1,8 @@
+====================
+DFHack API Reference
+====================
+
+.. toctree::
+ :maxdepth: 1
+
+ /docs/api/Maps
diff --git a/docs/build-pdf.sh b/docs/build-pdf.sh
new file mode 100755
index 000000000..76908b49b
--- /dev/null
+++ b/docs/build-pdf.sh
@@ -0,0 +1,23 @@
+#!/bin/sh
+
+# usage:
+# ./build-pdf.sh
+# SPHINX=/path/to/sphinx-build ./build-pdf.sh
+# JOBS=3 ./build-pdf.sh ...
+# all command-line arguments are passed directly to sphinx-build - run
+# ``sphinx-build --help`` for a list, or see
+# https://www.sphinx-doc.org/en/master/man/sphinx-build.html
+
+cd $(dirname "$0")
+cd ..
+
+sphinx=sphinx-build
+if [ -n "$SPHINX" ]; then
+ sphinx=$SPHINX
+fi
+
+if [ -z "$JOBS" ]; then
+ JOBS=2
+fi
+
+"$sphinx" -M latexpdf . ./docs/pdf -w ./docs/_sphinx-warnings.txt -j "$JOBS" "$@"
diff --git a/docs/build.sh b/docs/build.sh
index 6745db4d5..95a97e539 100755
--- a/docs/build.sh
+++ b/docs/build.sh
@@ -1,9 +1,12 @@
#!/bin/sh
# usage:
-# ./build.sh
-# ./build.sh sphinx-executable
-# JOBS=3 ./build.sh ...
+# ./build.sh
+# SPHINX=/path/to/sphinx-build ./build.sh
+# JOBS=3 ./build.sh ...
+# all command-line arguments are passed directly to sphinx-build - run
+# ``sphinx-build --help`` for a list, or see
+# https://www.sphinx-doc.org/en/master/man/sphinx-build.html
cd $(dirname "$0")
cd ..
@@ -17,4 +20,4 @@ if [ -z "$JOBS" ]; then
JOBS=2
fi
-"$sphinx" -a -E -q -b html . ./docs/html -w ./docs/_sphinx-warnings.txt -j "$JOBS" "$@"
+"$sphinx" -a -b html . ./docs/html -w ./docs/_sphinx-warnings.txt -j "$JOBS" "$@"
diff --git a/docs/changelog.txt b/docs/changelog.txt
index d2404c951..8ca5fa316 100644
--- a/docs/changelog.txt
+++ b/docs/changelog.txt
@@ -1,16 +1,10 @@
=== Scroll down for changes
===[[[
-===help
+The text below is included in docs/Documentation.rst - see that file for more details on the changelog setup.
+This is kept in this file as a quick syntax reference.
-Entries in docs/NEWS.rst and docs/NEWS-dev.rst are generated from
-docs/changelog.txt. NEWS.rst groups entries by stable releases, and NEWS-dev.rst
-groups them by all releases (stable and development). For example, an entry
-listed under "0.44.05-alpha1" in changelog.txt will be listed under that in
-NEWS-dev.rst as well, but under "0.44.05-r1" in NEWS.rst (assuming that is the
-closest stable release after 0.44.05-alpha1). An entry listed under a stable
-release in changelog.txt will be listed under that release in both NEWS.rst and
-NEWS-dev.rst.
+===help
changelog.txt uses a syntax similar to RST, with a few special sequences:
@@ -40,12 +34,120 @@ changelog.txt uses a syntax similar to RST, with a few special sequences:
# Future
## Fixes
+- Fixed an issue on some Linux systems where DFHack installed through a package manager would attempt to write files to a non-writable folder (notably when running `exportlegends` or `gui/autogems`)
+- `buildingplan`: artifacts are now successfully matched when max quality is set to ``artifacts``
+- `buildingplan`: no longer erroneously matches items to buildings while the game is paused
+- `dwarfmonitor`: fixed a crash when opening the ``prefs`` screen if units have vague preferences
+- `embark-assistant`: fixed an issue causing incursion resource matching (e.g. sand/clay) to skip some tiles if those resources were provided only through incursions
+- `zone`: fixed an issue causing the ``enumnick`` subcommand to run when attempting to run ``assign``, ``unassign``, or ``slaughter``
+
+## Misc Improvements
+- `buildingplan`: all buildings, furniture, and constructions are now supported (except for instruments)
+- `buildingplan`: now respects building job_item filters when matching items, so you can set your own programmatic filters for buildings before submitting them to buildingplan
+- `buildingplan`: default filter setting for max quality changed from ``artifact`` to ``masterwork``
+- `buildingplan`: min quality adjustment hotkeys changed from 'qw' to 'QW' to avoid conflict with existing hotkeys for setting roller speed. max quality adjustment hotkeys changed from 'QW' to 'AS' to make room for the min quality hotkey changes.
+- `buildingplan`: new global settings page accessible via ``G`` hotkey when on any building build screen; ``Quickfort Mode`` toggle for legacy Python Quickfort has been moved to this page
+- `buildingplan`: new global settings for whether generic building materials should match blocks, boulders, logs, and/or bars. defaults are everything but bars.
+- `quickfort`: The Dreamfort sample blueprints now have complete walkthroughs for each fort level and importable orders that automate basic fort stock management
+- `quickfort`: More blueprints have been added to the blueprints library: several bedroom layouts, the Saracen Crypts, and the complete fortress example from Python Quickfort: TheQuickFortress
+
+## API
+- `buildingplan`: added Lua interface API
+- add item type param to dfhack.job.isSuitableMaterial() so the non_economic flag can be properly handled (it was being matched for all item types instead of just boulders)
+
+# 0.47.04-r3
+
+## New Plugins
+- `xlsxreader`: provides an API for Lua scripts to read Excel spreadsheets
+
+## Fixes
+- `buildingplan`: fixed handling of buildings that require buckets
+- `getplants`: fixed a crash that could occur on some maps
+- `search`: fixed an issue causing item counts on the trade screen to display inconsistently when searching
+- `stockpiles`: fixed a crash when loading food stockpiles
+- `stockpiles`: fixed an error when saving furniture stockpiles
+
+## Misc Improvements
+- `createitem`: added support for plant growths (fruit, berries, leaves, etc.)
+- `createitem`: added an ``inspect`` subcommand to print the item and material tokens of existing items, which can be used to create additional matching items
+- `embark-assistant`: added support for searching for taller waterfalls (up to 50 z-levels tall)
+- `search`: added support for searching for names containing non-ASCII characters using their ASCII equivalents
+- `stocks`: added support for searching for items containing non-ASCII characters using their ASCII equivalents
+- `zone`: added an ``enumnick`` subcommand to assign enumerated nicknames (e.g "Hen 1", "Hen 2"...)
+- `zone`: added slaughter indication to ``uinfo`` output
+
+## Documentation
+- Fixed syntax highlighting of most code blocks to use the appropriate language (or no language) instead of Python
+
+## API
+- Added ``DFHack::to_search_normalized()`` (Lua: ``dfhack.toSearchNormalized()``) to convert non-ASCII alphabetic characters to their ASCII equivalents
+
+# 0.47.04-r2
+
+## New Tweaks
+- `tweak` do-job-now: adds a job priority toggle to the jobs list
+- `tweak` reaction-gloves: adds an option to make reactions produce gloves in sets with correct handedness
+
+## Fixes
+- Fixed a segfault when attempting to start a headless session with a graphical PRINT_MODE setting
+- Fixed an issue with the macOS launcher failing to un-quarantine some files
+- Linux: fixed ``dfhack.getDFPath()`` (Lua) and ``Process::getPath()`` (C++) to always return the DF root path, even if the working directory has changed
+- `getplants`: fixed issues causing plants to be collected even if they have no growths (or unripe growths)
+- `labormanager`: fixed handling of new jobs in 0.47
+- `labormanager`: fixed an issue preventing custom furnaces from being built
+- `embark-assistant`: fixed a couple of incursion handling bugs.
+- Fixed ``Units::isEggLayer``, ``Units::isGrazer``, ``Units::isMilkable``, ``Units::isTrainableHunting``, ``Units::isTrainableWar``, and ``Units::isTamable`` ignoring the unit's caste
+- `RemoteFortressReader`: fixed a couple crashes that could result from decoding invalid enum items (``site_realization_building_type`` and ``improvement_type``)
+- `RemoteFortressReader`: fixed an issue that could cause block coordinates to be incorrect
+- `rendermax`: fixed a hang that could occur when enabling some renderers, notably on Linux
+- `stonesense`: fixed a crash when launching Stonesense
+- `stonesense`: fixed some issues that could cause the splash screen to hang
+
+## Misc Improvements
+- Linux/macOS: Added console keybindings for deleting words (Alt+Backspace and Alt+d in most terminals)
+- `blueprint`: now writes blueprints to the ``blueprints/`` subfolder instead of the df root folder
+- `blueprint`: now automatically creates folder trees when organizing blueprints into subfolders (e.g. ``blueprint 30 30 1 rooms/dining dig`` will create the file ``blueprints/rooms/dining-dig.csv``); previously it would fail if the ``blueprints/rooms/`` directory didn't already exist
+- `confirm`: added a confirmation dialog for convicting dwarves of crimes
+- `manipulator`: added a new column option to display units' goals
+
+## API
+- Added ``Filesystem::mkdir_recursive``
+- Extended ``Filesystem::listdir_recursive`` to optionally make returned filenames relative to the start directory
+- ``Units``: added goal-related functions: ``getGoalType()``, ``getGoalName()``, ``isGoalAchieved()``
+
+## Internals
+- Added support for splitting scripts into multiple files in the ``scripts/internal`` folder without polluting the output of `ls`
+
+## Lua
+- Added a ``ref_target`` field to primitive field references, corresponding to the ``ref-target`` XML attribute
+- Made ``dfhack.units.getRaceNameById()``, ``dfhack.units.getRaceBabyNameById()``, and ``dfhack.units.getRaceChildNameById()`` available to Lua
+
+## Ruby
+- Updated ``item_find`` and ``building_find`` to use centralized logic that works on more screens
+
+## Documentation
+- Expanded the installation guide
+- Added some new dev-facing pages, including dedicated pages about the remote API, memory research, and documentation
+- Made a couple theme adjustments
+
+# 0.47.04-r1
+
+## Fixes
+- Fixed translation of certain types of in-game names
+- Fixed a crash in ``find()`` for some types when no world is loaded
+- `autogems`: fixed an issue with binned gems being ignored in linked stockpiles
+- `stocks`: fixed display of book titles
- `tweak` embark-profile-name: fixed handling of the native shift+space key
## Misc Improvements
+- ``dfhack.init-example``: enabled `autodump`
+- `getplants`: added switches for designations for farming seeds and for max number designated per plant
- `manipulator`: added intrigue to displayed skills
- `search`: added support for the fortress mode justice screen
+## API
+- Added ``Items::getBookTitle`` to get titles of books. Catches titles buried in improvements, unlike getDescription.
+
## Lua
- ``pairs()`` now returns available class methods for DF types
diff --git a/docs/gen_changelog.py b/docs/gen_changelog.py
index cd27d99d2..3b4452f62 100644
--- a/docs/gen_changelog.py
+++ b/docs/gen_changelog.py
@@ -1,284 +1,5 @@
-import collections
-import copy
-import itertools
-import os
-import sys
+import os, sys
+sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'sphinx_extensions'))
-CHANGELOG_PATHS = (
- 'docs/changelog.txt',
- 'scripts/changelog.txt',
- 'library/xml/changelog.txt',
-)
-
-CHANGELOG_SECTIONS = [
- 'New Plugins',
- 'New Scripts',
- 'New Tweaks',
- 'New Features',
- 'New Internal Commands',
- 'Fixes',
- 'Misc Improvements',
- 'Removed',
- 'API',
- 'Internals',
- 'Lua',
- 'Ruby',
- 'Structures',
-]
-
-REPLACEMENTS = {
- '`search`': '`search-plugin`',
-}
-
-def to_title_case(word):
- if word == word.upper():
- # Preserve acronyms
- return word
- return word[0].upper() + word[1:].lower()
-
-def find_all_indices(string, substr):
- start = 0
- while True:
- i = string.find(substr, start)
- if i == -1:
- return
- yield i
- start = i + 1
-
-def replace_text(string, replacements):
- for old_text, new_text in replacements.items():
- new_string = ''
- new_string_end = 0 # number of characters from string in new_string
- for i in find_all_indices(string, old_text):
- if i > 0 and string[i - 1] == '!':
- # exempt if preceded by '!'
- new_string += string[new_string_end:i - 1]
- new_string += old_text
- else:
- # copy until this occurrence
- new_string += string[new_string_end:i]
- new_string += new_text
- new_string_end = i + len(old_text)
- new_string += string[new_string_end:]
- string = new_string
- return string
-
-class ChangelogEntry(object):
- def __init__(self, text, section, stable_version, dev_version):
- text = text.lstrip('- ')
- # normalize section to title case
- self.section = ' '.join(map(to_title_case, section.strip().split()))
- self.stable_version = stable_version
- self.dev_version = dev_version
- self.dev_only = text.startswith('@')
- text = text.lstrip('@ ')
- self.children = []
-
- split_index = text.find(': ')
- if split_index != -1:
- self.feature, description = text[:split_index], text[split_index+1:]
- if description.strip():
- self.children.insert(0, description.strip())
- else:
- self.feature = text
- self.feature = self.feature.replace(':\\', ':').rstrip(':')
-
- self.sort_key = self.feature.upper()
-
- def __repr__(self):
- return 'ChangelogEntry(%r, %r)' % (self.feature, self.children)
-
-def parse_changelog():
- entries = []
-
- for fpath in CHANGELOG_PATHS:
- if not os.path.isfile(fpath):
- continue
- with open(fpath) as f:
- cur_stable = None
- cur_dev = None
- cur_section = None
- last_entry = None
- multiline = ''
- for line_id, line in enumerate(f.readlines()):
- line_id += 1
-
- if multiline:
- multiline += line
- elif '[[[' in line:
- multiline = line.replace('[[[', '')
-
- if ']]]' in multiline:
- line = multiline.replace(']]]', '')
- multiline = ''
- elif multiline:
- continue
-
- if not line.strip() or line.startswith('==='):
- continue
-
- if line.startswith('##'):
- cur_section = line.lstrip('#').strip()
- elif line.startswith('#'):
- cur_dev = line.lstrip('#').strip().lower()
- if ('alpha' not in cur_dev and 'beta' not in cur_dev and
- 'rc' not in cur_dev):
- cur_stable = cur_dev
- elif line.startswith('-'):
- if not cur_stable or not cur_dev or not cur_section:
- raise ValueError(
- '%s:%i: Entry without section' % (fpath, line_id))
- last_entry = ChangelogEntry(line.strip(), cur_section,
- cur_stable, cur_dev)
- entries.append(last_entry)
- elif line.lstrip().startswith('-'):
- if not cur_stable or not cur_dev:
- raise ValueError(
- '%s:%i: Sub-entry without section' % (fpath, line_id))
- if not last_entry:
- raise ValueError(
- '%s:%i: Sub-entry without parent' % (fpath, line_id))
- last_entry.children.append(line.strip('- \n'))
- else:
- raise ValueError('Invalid line: ' + line)
-
- if not entries:
- raise RuntimeError('No changelog files with contents found')
-
- return entries
-
-def consolidate_changelog(all_entries):
- for sections in all_entries.values():
- for section, entries in sections.items():
- # sort() is stable, so reverse entries so that older entries for the
- # same feature are on top
- entries.reverse()
- entries.sort(key=lambda entry: entry.sort_key)
- new_entries = []
- for feature, group in itertools.groupby(entries,
- lambda e: e.feature):
- old_entries = list(group)
- children = list(itertools.chain(*[entry.children
- for entry in old_entries]))
- new_entry = copy.deepcopy(old_entries[0])
- new_entry.children = children
- new_entries.append(new_entry)
- entries[:] = new_entries
-
-
-
-def print_changelog(versions, all_entries, path, replace=True, prefix=''):
- # all_entries: version -> section -> entry
- with open(path, 'w') as f:
- def write(line):
- if replace:
- line = replace_text(line, REPLACEMENTS)
- f.write(prefix + line + '\n')
- for version in versions:
- sections = all_entries[version]
- if not sections:
- continue
- version = 'DFHack ' + version
- write(version)
- write('=' * len(version))
- write('')
- for section in CHANGELOG_SECTIONS:
- entries = sections[section]
- if not entries:
- continue
- write(section)
- write('-' * len(section))
- for entry in entries:
- if len(entry.children) == 1:
- write('- ' + entry.feature + ': ' +
- entry.children[0].strip('- '))
- continue
- elif entry.children:
- write('- ' + entry.feature + ':')
- write('')
- for child in entry.children:
- write(' - ' + child)
- write('')
- else:
- write('- ' + entry.feature)
- write('')
- write('')
-
-
-def generate_changelog(all=False):
- entries = parse_changelog()
-
- # scan for unrecognized sections
- for entry in entries:
- if entry.section not in CHANGELOG_SECTIONS:
- raise RuntimeWarning('Unknown section: ' + entry.section)
-
- # ordered versions
- versions = ['future']
- # map versions to stable versions
- stable_version_map = {}
- # version -> section -> entry
- stable_entries = collections.defaultdict(lambda:
- collections.defaultdict(list))
- dev_entries = collections.defaultdict(lambda:
- collections.defaultdict(list))
-
- for entry in entries:
- # build list of all versions
- if entry.dev_version not in versions:
- versions.append(entry.dev_version)
- stable_version_map.setdefault(entry.dev_version, entry.stable_version)
-
- if not entry.dev_only:
- # add non-dev-only entries to both changelogs
- stable_entries[entry.stable_version][entry.section].append(entry)
- dev_entries[entry.dev_version][entry.section].append(entry)
-
- consolidate_changelog(stable_entries)
-
- print_changelog(versions, stable_entries, 'docs/_auto/news.rst')
- print_changelog(versions, dev_entries, 'docs/_auto/news-dev.rst')
-
- if all:
- for version in versions:
- if version not in stable_version_map:
- print('warn: skipping ' + version)
- continue
- if stable_version_map[version] == version:
- version_entries = {version: stable_entries[version]}
- else:
- version_entries = {version: dev_entries[version]}
- print_changelog([version], version_entries,
- 'docs/_changelogs/%s-github.txt' % version,
- replace=False)
- print_changelog([version], version_entries,
- 'docs/_changelogs/%s-reddit.txt' % version,
- replace=False,
- prefix='> ')
-
- return entries
-
-if __name__ == '__main__':
- import argparse
- parser = argparse.ArgumentParser()
- parser.add_argument('-a', '--all', action='store_true',
- help='Print changelogs for all versions to docs/_changelogs')
- parser.add_argument('-c', '--check', action='store_true',
- help='Check that all entries are printed')
- args = parser.parse_args()
-
- os.chdir(os.path.abspath(os.path.dirname(__file__)))
- os.chdir('..')
- entries = generate_changelog(all=args.all)
-
- if args.check:
- with open('docs/_auto/news.rst') as f:
- content_stable = f.read()
- with open('docs/_auto/news-dev.rst') as f:
- content_dev = f.read()
- for entry in entries:
- for description in entry.children:
- if not entry.dev_only and description not in content_stable:
- print('stable missing: ' + description)
- if description not in content_dev:
- print('dev missing: ' + description)
+from dfhack.changelog import cli_entrypoint
+cli_entrypoint()
diff --git a/docs/guides/index.rst b/docs/guides/index.rst
new file mode 100644
index 000000000..7208b5276
--- /dev/null
+++ b/docs/guides/index.rst
@@ -0,0 +1,11 @@
+===========
+User Guides
+===========
+
+These pages are detailed guides covering DFHack tools.
+
+.. toctree::
+ :maxdepth: 1
+ :glob:
+
+ *
diff --git a/docs/guides/quickfort-user-guide.rst b/docs/guides/quickfort-user-guide.rst
new file mode 100644
index 000000000..1d9c1a024
--- /dev/null
+++ b/docs/guides/quickfort-user-guide.rst
@@ -0,0 +1,1513 @@
+.. _quickfort-user-guide:
+
+Quickfort User Guide
+====================
+
+`Quickfort ` is a DFHack script that helps you build fortresses from
+"blueprint" .csv and .xlsx files. Many applications exist to edit these files,
+such as MS Excel and `Google Sheets `__. Most layout and
+building-oriented DF commands are supported through the use of multiple files or
+spreadsheets, each describing a different phase of DF construction: designation,
+building, placing stockpiles/zones, and setting configuration.
+
+The original idea came from :wiki:`Valdemar's ` auto-designation
+macro. Joel Thornton reimplemented the core logic in Python and extended its
+functionality with `Quickfort 2.0 `__. This
+DFHack-native implementation, called "DFHack Quickfort" or just "quickfort",
+builds upon Quickfort 2.0's formats and features. Any blueprint that worked in
+Python Quickfort 2.0 should work with DFHack Quickfort. DFHack Quickfort is
+written in Lua and interacts with Dwarf Fortress memory structures directly,
+allowing for instantaneous blueprint application, error checking and recovery,
+and many other advanced features.
+
+This document focuses on DFHack Quickfort's capabilities and teaches players how
+to understand and create blueprint files. Some of the text was originally
+written by Joel Thornton, reused here with his permission.
+
+For those just looking to apply existing blueprints, check out the `quickfort
+command's documentation ` for syntax. There are many ready-to-use
+blueprints available in the ``blueprints/library`` subfolder in your DFHack
+installation. Browse them on your computer or
+:source:`online `, or run ``quickfort list -l`` at the
+``[DFHack]#`` prompt to list them, and then ``quickfort run`` to apply them to
+your fort!
+
+Before you become an expert at writing blueprints, though, you should know that
+the easiest way to make a quickfort blueprint is to build your plan "for real"
+in Dwarf Fortress and then export your map using the DFHack `blueprint` plugin.
+You can apply those blueprints as-is in your next fort, or you can fine-tune
+them with additional features from this guide.
+
+See the `Links`_ section for more information and online resources.
+
+
+.. contents:: Table of Contents
+ :local:
+ :depth: 2
+
+
+Features
+--------
+
+- General
+
+ - Manages blueprints to handle all phases of DF construction
+ - Supports .csv and multi-worksheet .xlsx blueprint files
+ - Near-instant application, even for very large and complex blueprints
+ - Blueprints can span multiple z-levels
+ - Supports multiple blueprints per .csv file/spreadsheet sheet
+ - "meta" blueprints that automate the application of sequences of blueprints
+ - Undo functionality for dig, build, place, and zone blueprints
+ - Automatic cropping of blueprints so you don't get errors if the blueprint
+ extends off the map
+ - Can generate manager orders for everything required by a build blueprint
+ - Library of ready-to-use blueprints included
+ - Verbose output mode for debugging
+
+- Dig mode
+
+ - Supports all types of designations, including dumping/forbidding items and
+ setting traffic settings
+ - Supports setting dig priorities
+ - Supports applying dig blueprints in marker mode
+ - Handles carving arbitrarily complex minecart tracks, including tracks that
+ cross other tracks
+
+- Build mode
+
+ - DFHack buildingplan integration, so you can place buildings before
+ manufacturing all required source materials
+ - Designate complete constructions at once, without having to wait for each
+ tile to become supported before you can build it
+ - Automatic expansion of building footprints to their minimum dimensions, so
+ only the center tile of a multi-tile building needs to be recorded in the
+ blueprint
+ - Tile occupancy and validity checking so, for example, buildings that
+ cannot be placed on a certain tile will simply be skipped instead of the
+ blueprint failing to apply. Blueprints that are only partially applied for
+ any reason (for example, you need to dig out some more tiles) can be
+ safely reapplied to build the remaining buildings.
+ - Relaxed rules for farm plot and road placement: you can still place the
+ building even if an invalid tile (e.g. stone tiles for farm plots) splits
+ the designated area into two parts
+ - Intelligent boundary detection for adjacent buildings of the same type
+ (e.g. a 6x6 block of ``wj`` cells will be correctly split into 4 jeweler's
+ workshops)
+
+- Place and zone modes
+
+ - Define stockpiles and zones in any continguous shape, not just rectangular
+ blocks
+ - Configurable maximums for bins, barrels and wheelbarrows assigned to
+ created stockpiles
+ - Automatic splitting of stockpiles and zones that exceed maximum dimension
+ limits
+ - Full access to all zone settings, such as hospital supply counts
+
+- Query mode
+
+ - Send arbitrary keystroke sequences to the UI -- *anything* you can do
+ through the UI is supported
+ - Supports aliases to automate frequent keystroke combos
+ - Includes a library of pre-made and tested aliases to automate most common
+ tasks, such as configuring stockpiles for important item types or creating
+ named hauling routes for quantum stockpiles.
+ - Supports including aliases in other aliases, and repeating key sequences a
+ specified number of times
+ - Skips sending key sequences when the cursor is over a tile that does not
+ have a stockpile or building, so missing buildings won't desynchronize
+ your blueprint
+ - Instant halting of query blueprint application when keystroke errors are
+ detected, such as when a key sequence leaves us stuck in a submenu, to
+ make blueprint misconfigurations easier to debug
+
+Editing Blueprints
+------------------
+
+We recommend using a spreadsheet editor such as Excel, `Google
+Sheets `__, or `LibreOffice `__
+to edit blueprint files, but any text editor will do.
+
+The format of Quickfort-compatible blueprint files is straightforward. The first
+line (or upper-left cell) of the spreadsheet should look like this:
+
+::
+
+ #dig This is a decription.
+
+The keyword "dig" tells Quickfort we are going to be using the Designations menu
+in DF. The following "mode" keywords are understood:
+
+::
+
+ dig Designations menu (d)
+ build Build menu (b)
+ place Place stockpiles menu (p)
+ zone Activity zones menu (i)
+ query Set building tasks/prefs menu (q)
+
+If no modeline appears in the first cell, the file or sheet is interpreted as a
+``#dig`` blueprint.
+
+There are also "meta" and "notes" blueprints, but we'll talk about
+`those ` `later `.
+
+Optionally following this keyword and a space, you may enter a comment. This
+comment will appear in the output of ``quickfort list`` when run from the
+``DFHack#`` prompt. You can use this space for explanations, attribution, etc.
+
+Below this line begin entering the keys you want sent in each cell. For example,
+we could dig out a 4x4 room like so (spaces are used as column separators here
+for clarity, but a real .csv file would have commas):
+
+::
+
+ #dig
+ d d d d #
+ d d d d #
+ d d d d #
+ d d d d #
+ # # # # #
+
+Note the # symbols at the right end of each row and below the last row. These
+are completely optional, but can be helpful to make the row and column positions
+clear.
+
+Once the dwarves have that dug out, let's build a walled-in bedroom within our
+dug-out area:
+
+::
+
+ #build
+ Cw Cw Cw Cw #
+ Cw b h Cw #
+ Cw Cw #
+ Cw Cw Cw #
+ # # # # #
+
+Note my generosity - in addition to the bed (b) I've built a chest (h) here for
+the dwarf as well. You must use the full series of keys needed to build
+something in each cell, e.g. 'Cw' enters DF's constructions submenu (C) and
+selects walls (w).
+
+I'd also like to place a booze stockpile in the 2 unoccupied tiles in the room.
+
+::
+
+ #place Place a food stockpile
+ ` ` ` ` #
+ ` ` ` ` #
+ ` f(2x1)#
+ ` ` ` ` #
+ # # # # #
+
+This illustration may be a little hard to understand. The f(2x1) is in column 2,
+row 3. All the other cells are empty. QF considers both "`" (backtick -- the
+character under the tilde) and "~" (tilde) characters within cells to be empty
+cells; this can help with multilayer or fortress-wide blueprint layouts as
+'chalk lines'.
+
+With f(2x1), we've asked QF to place a food stockpile 2 units wide by 1 high
+unit. Note that the f(2x1) syntax isn't actually necessary here; we could have
+just used:
+
+::
+
+ #place Place a food stockpile
+ ` ` ` ` #
+ ` ` ` ` #
+ ` f f ` #
+ ` ` ` ` #
+ # # # # #
+
+QF is smart enough to recognize this as a 2x1 food stockpile, and creates it as
+such rather than as two 1x1 food stockpiles. Quickfort recognizes any connected
+region of identical designations as a single stockpile. The tiles can be
+connected orthogonally or diagonally, just as long as they are touching somehow.
+
+Lastly, let's turn the bed into a bedroom and set the food stockpile to hold
+only booze.
+
+::
+
+ #query
+ ` ` ` ` #
+ ` r& ` #
+ ` booze #
+ ` ` ` ` #
+ # # # # #
+
+In column 2, row 2 we have "r&". This sends the "r" key to DF when the cursor is
+over the bed, causing us to 'make room' and "&", which is a special symbol that
+expands to "{Enter}", to indicate that we're done.
+
+In column 2, row 3 we have "booze". This is one of many alias keywords defined
+in the included :source:`baseline aliases file `.
+This particular alias sets a food stockpile to carry booze only. It sends the
+keys needed to navigate DF's stockpile settings menu, and then sends an Escape
+character ("^" or "{ESC}") to exit back to the map. It is important to exit out
+of any menus that you enter while in query mode so that the cursor can move to
+the next tile when it is done configuring the current tile.
+
+Check out the included :source:`blueprint library `
+to see many more examples. Read the baseline aliases file for helpful
+pre-packaged aliases, or create your own in
+:source:`dfhack-config/quickfort/aliases.txt` in your DFHack installation.
+
+Area expansion syntax
+~~~~~~~~~~~~~~~~~~~~~
+
+In Quickfort, the following blueprints are equivalent:
+
+::
+
+ #dig a 3x3 area
+ d d d #
+ d d d #
+ d d d #
+ # # # #
+
+ #dig the same area with d(3x3) specified in row 1, col 1
+ d(3x3)#
+ ` ` ` #
+ ` ` ` #
+ # # # #
+
+The second example uses Quickfort's "area expansion syntax", which takes the
+form:
+
+::
+
+ keys(WxH)
+
+In Quickfort the above two examples of specifying a contiguous 3x3 area produce
+identical output: a single 3x3 designation will be performed, rather than nine
+1x1 designations as the first example might suggest.
+
+Area expansion syntax can only specify rectangular areas. If you want to create
+extent-based structures (e.g. farm plots or stockpiles) in different shapes, use
+the first format above. For example:
+
+::
+
+ #place L shaped food stockpile
+ f f ` ` #
+ f f ` ` #
+ f f f f #
+ f f f f #
+ # # # # #
+
+Area expansion syntax also sets boundaries, which can be useful if you want
+adjacent, but separate, stockpiles of the same type:
+
+::
+
+ #place Two touching but separate food stockpiles
+ f(4x2) #
+ ~ ~ ~ ~ #
+ f(4x2) #
+ ~ ~ ~ ~ #
+ # # # # #
+
+As mentioned previously, "~" characters are ignored as comment characters and
+can be used for visualizing the blueprint layout. The blueprint can be
+equivalently written as:
+
+::
+
+ #place Two touching but separate food stockpiles
+ f(4x2) #
+ ~ ~ ~ ~ #
+ f f f f #
+ f f f f #
+ # # # # #
+
+since the area expansion syntax of the upper stockpile prevents it from
+combining with the lower, freeform syntax stockpile.
+
+Area expansion syntax can also be used for buildings which have an adjustable
+size, like bridges. The following blueprints are equivalent:
+
+::
+
+ #build a 4x2 bridge from row 1, col 1
+ ga(4x2) ` #
+ ` ` ` ` #
+ # # # # #
+
+ #build a 4x2 bridge from row 1, col 1
+ ga ga ga ga #
+ ga ga ga ga #
+ # # # # #
+
+Automatic area expansion
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+Buildings larger than 1x1, like workshops, can be represented in any of three
+ways. You can designate just their center tile with empty cells around it to
+leave room for the footprint, like this:
+
+::
+
+ #build a mason workshop in row 2, col 2 that will occupy the 3x3 area
+ ` ` ` #
+ ` wm ` #
+ ` ` ` #
+ # # # #
+
+Or you can fill out the entire footprint like this:
+
+::
+
+ #build a mason workshop
+ wm wm wm #
+ wm wm wm #
+ wm wm wm #
+ # # # #
+
+This format may be verbose for regular workshops, but it can be very helpful for
+laying out structures like screw pump towers and waterwheels, whose "center
+point" can be non-obvious.
+
+Finally, you can use area expansion syntax to represent the workshop:
+
+::
+
+ #build a mason workshop
+ wm(3x3) #
+ ` ` ` #
+ ` ` ` #
+ # # # #
+
+This style can be convenient for laying out multiple buildings of the same type.
+If you are building a large-scale block factory, for example, this will create
+20 mason workshops all in a row:
+
+::
+
+ #build line of 20 mason workshops
+ wm(60x3) #
+
+Quickfort will intelligently break large areas of the same designation into
+appropriately-sized chunks.
+
+Multilevel blueprints
+~~~~~~~~~~~~~~~~~~~~~
+
+Multilevel blueprints are accommodated by separating Z-levels of the blueprint
+with ``#>`` (go down one z-level) or ``#<`` (go up one z-level) at the end of
+each floor.
+
+::
+
+ #dig Stairs leading down to a small room below
+ j ` ` #
+ ` ` ` #
+ ` ` ` #
+ #> # # #
+ u d d #
+ d d d #
+ d d d #
+ # # # #
+
+The marker must appear in the first column of the row to be recognized, just
+like a modeline.
+
+.. _quickfort-dig-priorities:
+
+Dig priorities
+~~~~~~~~~~~~~~
+
+DF designation priorities are supported for ``#dig`` blueprints. The full syntax
+is ``[letter][number][expansion]``, where if the ``letter`` is not specified,
+``d`` is assumed, and if ``number`` is not specified, ``4`` is assumed (the
+default priority). So each of these blueprints is equivalent:
+
+::
+
+ #dig dig the interior of the room at high priority
+ d d d d d #
+ d d1 d1 d1 d #
+ d d1 d1 d1 d #
+ d d1 d1 d1 d #
+ d d d d d #
+ # # # # # #
+
+ #dig dig the interior of the room at high priority
+ d d d d d #
+ d d1(3x3) d #
+ d ` ` ` d #
+ d ` ` ` d #
+ d d d d d #
+ # # # # # #
+
+ #dig dig the interior of the room at high priority
+ 4 4 4 4 4 #
+ 4 1 1 1 4 #
+ 4 1 1 1 4 #
+ 4 1 1 1 4 #
+ 4 4 4 4 4 #
+ # # # # # #
+
+Marker mode
+~~~~~~~~~~~
+
+Marker mode is useful for when you want to plan out your digging, but you don't
+want to dig everything just yet. In ``#dig`` mode, you can add a ``m`` before
+any other designation letter to indicate that the tile should be designated in
+marker mode. For example, to dig out the perimeter of a room, but leave the
+center of the room marked for digging later:
+
+::
+
+ #dig
+ d d d d d #
+ d md md md d #
+ d md md md d #
+ d md md md d #
+ d d d d d #
+ # # # # # #
+
+Then you can use "Toggle Standard/Marking" (``d-M``) to convert the center tiles
+to regular designations at your leisure.
+
+To apply an entire dig blueprint in marker mode, regardless of what the
+blueprint itself says, you can set the global quickfort setting
+``force_marker_mode`` to ``true`` before you apply the blueprint.
+
+Note that the in-game UI setting "Standard/Marker Only" (``d-m``) does not have
+any effect on quickfort.
+
+Stockpiles and zones
+~~~~~~~~~~~~~~~~~~~~
+
+It is very common to have stockpiles that accept multiple categories of items or
+zones that permit more than one activity. Although it is perfectly valid to
+declare a single-purpose stockpile or zone and then modify it with a ``#query``
+blueprint, quickfort also supports directly declaring all the types on the
+``#place`` and ``#zone`` blueprints. For example, to declare a 20x10 stockpile
+that accepts both corpses and refuse, you could write:
+
+::
+
+ #place refuse heap
+ yr(20x10)
+
+
+And similarly, to declare a zone that is a pasture, a fruit picking area, and a
+meeting area all at once:
+
+::
+
+ #zone main pasture and picnic area
+ nmg(10x10)
+
+The order of the individual letters doesn't matter. If you want to configure the
+stockpile from scratch in a ``#query`` blueprint, you can place unconfigured
+"custom" stockpiles with (:kbd:`c`). It is more efficient, though, to place
+stockpiles using the keys that represent the types you want to store, and
+then only use a ``#query`` blueprint if you need fine-grained customization.
+
+Detailed configuration for zones, such as the pit/pond toggle, can also be set
+by mimicking the hotkeys used to set them. Note that gather flags default to
+true, so specifying them in a blueprint will turn the toggles off. If you need
+to set configuration from multiple zone subscreens, separate the key sections
+with ``^``. Note the special syntax for setting hospital supply levels, which
+have no in-game hotkeys:
+
+::
+
+ #zone a combination hospital and shrub (but not fruit) gathering zone
+ gGtf^hH{hospital buckets=5 splints=20}(10x10)
+
+The valid hospital settings (and their maximum values) are:
+
+::
+
+ thread (1500000)
+ cloth (1000000)
+ splints (100)
+ crutches (100)
+ powder (15000)
+ buckets (100)
+ soap (15000)
+
+To toggle the ``active`` flag for zones, add an ``a`` character to the string.
+For example, to create a *disabled* pond zone (that you later intend to
+carefully fill with 3-depth water for a dwarven bathtub):
+
+::
+
+ #zone disabled pond zone
+ apPf(1x3)
+
+Minecart tracks
+~~~~~~~~~~~~~~~
+
+There are two ways to produce minecart tracks, and they are handled very
+differently by the game. You can carve them into hard natural floors or you can
+construct them out of building materials. Constructed tracks are conceptually
+simpler, so we'll start with them.
+
+Constructed tracks
+``````````````````
+
+Quickfort supports the designation of track stops and rollers through the normal
+mechanisms: a ``#build`` blueprint with ``CS`` and some number of ``d`` and
+``a`` characters (for selecting dump direction and friction) in a cell
+designates a track stop and a ``#build`` blueprint with ``Mr`` and some number
+of ``s`` and ``q`` characters (for direction and speed) designates a roller.
+This can get confusing very quickly and is very difficult to read in a
+blueprint. Constructed track segments don't even have keys associated with them
+at all!
+
+To solve this problem, Quickfort provides the following keywords for use in
+build blueprints:
+
+::
+
+ -- Track segments --
+ trackN
+ trackS
+ trackE
+ trackW
+ trackNS
+ trackNE
+ trackNW
+ trackSE
+ trackSW
+ trackEW
+ trackNSE
+ trackNSW
+ trackNEW
+ trackSEW
+ trackNSEW
+
+ -- Track/ramp segments --
+ trackrampN
+ trackrampS
+ trackrampE
+ trackrampW
+ trackrampNS
+ trackrampNE
+ trackrampNW
+ trackrampSE
+ trackrampSW
+ trackrampEW
+ trackrampNSE
+ trackrampNSW
+ trackrampNEW
+ trackrampSEW
+ trackrampNSEW
+
+ -- Horizontal and vertical roller segments --
+ rollerH
+ rollerV
+ rollerNS
+ rollerSN
+ rollerEW
+ rollerWE
+
+ Note: append up to four 'q' characters to roller keywords to set roller
+ speed. E.g. a roller that propels from East to West at the slowest speed can
+ be specified with 'rollerEWqqqq'.
+
+ -- Track stops that (optionally) dump to the N/S/E/W --
+ trackstop
+ trackstopN
+ trackstopS
+ trackstopE
+ trackstopW
+
+ Note: append up to four 'a' characters to trackstop keywords to set friction
+ amount. E.g. a stop that applies the smallest amount of friction can be
+ specified with 'trackstopaaaa'.
+
+As an example, you can create an E-W track with stops at each end that dump to
+their outside directions with the following blueprint:
+
+::
+
+ #build Example track
+ trackstopW trackEW trackEW trackEW trackstopE
+
+Note that the **only** way to build track and track/ramp segments is with the
+keywords. The UI method of using "+" and "-" keys to select the track type from
+a list does not work since DFHack Quickfort doesn't actually send keys to the UI
+to build buildings. The text in your spreadsheet cells is mapped directly into
+DFHack API calls. Only ``#query`` blueprints still send actual keycodes to the
+UI.
+
+Carved tracks
+`````````````
+
+In the game, you carve a minecart track by specifying a beginning and ending
+tile and the game "adds" the designation to the tiles. You cannot designate
+single tiles. For example to carve two track segments that cross each other, you
+might use the cursor to designate a line of three vertical tiles like this:
+
+::
+
+ ` start here ` #
+ ` ` ` #
+ ` end here ` #
+ # # # #
+
+Then to carve the cross, you'd do a horizonal segment:
+
+::
+
+ ` ` ` #
+ start here ` end here #
+ ` ` ` #
+ # # # #
+
+This will result in a carved track that would be equivalent to a constructed
+track of the form:
+
+::
+
+ #build
+ ` trackS ` #
+ trackE trackNSEW trackW #
+ ` trackN ` #
+ # # # #
+
+To carve this same track with a ``#dig`` blueprint, you'd use area expansion
+syntax with a height or width of 1 to indicate the segments to designate:
+
+::
+
+ #dig
+ ` T(1x3) ` #
+ T(3x1) ` ` #
+ ` ` ` #
+ # # # #
+
+"But wait!", I can hear you say, "How do you designate a track corner that opens
+to the South and East? You can't put both T(1xH) and T(Wx1) in the same cell!"
+This is true, but you can specify both width and height, and for tracks, QF
+interprets it as an upper-left corner extending to the right W tiles and down H
+tiles. For example, to carve a track in a closed ring, you'd write:
+
+::
+
+ #dig
+ T(3x3) ` T(1x3) #
+ ` ` ` #
+ T(3x1) ` ` #
+ # # # #
+
+Which would result in a carved track simliar to a constructed track of the form:
+
+::
+
+ #build
+ trackSE trackEW trackSW #
+ trackNS ` trackNS #
+ trackNE trackEW trackNW #
+ # # # #
+
+.. _quickfort-modeline:
+
+Modeline markers
+~~~~~~~~~~~~~~~~
+
+The modeline has some additional optional components that we haven't talked
+about yet. You can:
+
+- give a blueprint a label by adding a ``label()`` marker
+- set a cursor offset and/or start hint by adding a ``start()`` marker
+- hide a blueprint from being listed with a ``hidden()`` marker
+- register a message to be displayed after the blueprint is successfully
+ applied
+
+The full modeline syntax, when everything is specified, is:
+
+::
+
+ #mode label(mylabel) start(X;Y;STARTCOMMENT) hidden() message(mymessage) comment
+
+Note that all elements are optional except for the initial ``#mode`` (though, as
+mentioned in the first section, if a modeline doesn't appear at all in the first
+cell of a spreadsheet, the blueprint is interpreted as a ``#dig`` blueprint with
+no optional markers). Here are a few examples of modelines with optional
+elements before we discuss them in more detail:
+
+::
+
+ #dig start(3; 3; Center tile of a 5-tile square) Regular blueprint comment
+ #build label(noblebedroom) start(10;15)
+ #query label(configstockpiles) No explicit start() means cursor is at upper left corner
+ #meta label(digwholefort) start(center of stairs on surface)
+ #dig label(digdining) hidden() managed by the digwholefort meta blueprint
+ #zone label(pastures) message(remember to assign animals to the new pastures)
+
+.. _quickfort-label:
+
+Blueprint labels
+````````````````
+
+Labels are displayed in the ``quickfort list`` output and are used for
+addressing specific blueprints when there are multiple blueprints in a single
+file or spreadsheet sheet (see `Packaging a set of blueprints`_ below). If a
+blueprint has no label, the label becomes the ordinal of the blueprint's
+position in the file or sheet. For example, the label of the first blueprint
+will be "1" if it is not otherwise set, the label of the second blueprint will
+be "2" if it is not otherwise set, etc. Labels that are explicitly defined must
+start with a letter to ensure the auto-generated labels don't conflict with
+user-defined labels.
+
+Start positions
+```````````````
+
+Start positions specify a cursor offset for a particular blueprint, simplifying
+the task of blueprint alignment. This is very helpful for blueprints that are
+based on a central staircase, but it helps whenever a blueprint has an obvious
+"center". For example:
+
+::
+
+ #build start(2;2;center of workshop) label(masonw) a mason workshop
+ wm wm wm #
+ wm wm wm #
+ wm wm wm #
+ # # # #
+
+will build the workshop *centered* on the cursor, not down and to the right of
+the cursor.
+
+The two numbers specify the column and row (or X and Y offset) where the cursor
+is expected to be when you apply the blueprint. Position 1;1 is the top left
+cell. The optional comment will show up in the ``quickfort list`` output and
+should contain information about where to position the cursor. If the start
+position is 1;1, you can omit the numbers and just add a comment describing
+where to put the cursor. This is also useful for meta blueprints that don't
+actually care where the cursor is, but that refer to other blueprints that have
+fully-specified ``start()`` markers. For example, a meta blueprint that refers
+to the ``masonw`` blueprint above could look like this:
+
+::
+
+ #meta start(center of workshop) a mason workshop
+ /masonw
+
+.. _quickfort-hidden:
+
+Hiding blueprints
+`````````````````
+
+A blueprint with a ``hidden()`` marker won't appear in ``quickfort list`` output
+unless the ``--hidden`` flag is specified. The primary reason for hiding a
+blueprint (rather than, say, deleting it or moving it out of the ``blueprints/``
+folder) is if a blueprint is intended to be run as part of a larger sequence
+managed by a `meta blueprint `.
+
+.. _quickfort-message:
+
+Messages
+````````
+
+A blueprint with a ``message()`` marker will display a message after the
+blueprint is applied with ``quickfort run``. This is useful for reminding
+players to take manual steps that cannot be automated, like assigning animals to
+a pasture or assigning minecarts to a route, or listing the next step in a
+series of blueprints. For long or multi-part messages, you can embed newlines:
+
+::
+
+ "#meta label(surface1) message(This would be a good time to start digging the industry level.
+ Once the area is clear, continue with /surface2.) clear the embark site and set up pastures"
+
+.. _quickfort-packaging:
+
+Packaging a set of blueprints
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+A complete specification for a section of your fortress may contain 5 or more
+separate blueprints, one for each "phase" of construction (dig, build, place
+stockpiles, designate zones, query building adjustments).
+
+To manage all the separate blueprints, it is often convenient to keep related
+blueprints in a single file. For .xlsx spreadsheets, you can keep each blueprint
+in a separate sheet. Online spreadsheet applications like `Google
+Sheets `__ make it easy to work with multiple related
+blueprints, and, as a bonus, they retain any formatting you've set, like column
+sizes and coloring.
+
+For both .csv files and .xlsx spreadsheets you can also add as many blueprints
+as you want in a single file or sheet. Just add a modeline in the first column
+to indicate the start of a new blueprint. Instead of multiple .csv files, you
+can concatenate them into one single file.
+
+For example, you can store multiple blueprints together like this:
+
+::
+
+ #dig label(bed1)
+ d d d d #
+ d d d d #
+ d d d d #
+ d d d d #
+ # # # # #
+ #build label(bed2)
+ b f h #
+ #
+ #
+ n #
+ # # # # #
+ #place label(bed3)
+ #
+ f(2x2) #
+ #
+ #
+ # # # # #
+ #query label(bed4)
+ #
+ booze #
+ #
+ #
+ # # # # #
+ #query label(bed5)
+ r{+ 3}& #
+ #
+ #
+ #
+ # # # # #
+
+Of course, you could still choose to keep your blueprints in single-sheet .csv
+files and just give related blueprints similar names:
+
+::
+
+ bedroom.1.dig.csv
+ bedroom.2.build.csv
+ bedroom.3.place.csv
+ bedroom.4.query.csv
+ bedroom.5.query2.csv
+
+But the naming and organization is completely up to you.
+
+.. _quickfort-meta:
+
+Meta blueprints
+~~~~~~~~~~~~~~~
+
+Meta blueprints are blueprints that script a series of other blueprints. Many
+blueprint packages follow this pattern:
+
+1. Apply dig blueprint to designate dig areas
+#. Wait for miners to dig
+#. **Apply build buildprint** to designate buildings
+#. **Apply place buildprint** to designate stockpiles
+#. **Apply query blueprint** to configure stockpiles
+#. Wait for buildings to get built
+#. Apply a different query blueprint to configure rooms
+
+Those three "apply"s in the middle might as well get done in one command instead
+of three. A meta blueprint can encode that sequence. A meta blueprint refers to
+other blueprints by their label (see the `Modeline markers`_ section above) in
+the same format used by the `quickfort` command: ``/