diff --git a/drupal-localgov/.dockerignore b/drupal-localgov/.dockerignore
new file mode 100644
index 0000000..42366c5
--- /dev/null
+++ b/drupal-localgov/.dockerignore
@@ -0,0 +1 @@
+/README.md
diff --git a/drupal-localgov/.env.example b/drupal-localgov/.env.example
new file mode 100644
index 0000000..a15d515
--- /dev/null
+++ b/drupal-localgov/.env.example
@@ -0,0 +1,18 @@
+# Do not edit this file. It is automatically generated by https://www.oliverdavies.uk/build-configs.
+
+export DOCKER_UID=1000
+
+export COMPOSE_PROJECT_NAME=docker-example-drupal-localgov
+export COMPOSE_PROFILES=web,php,database
+
+export DOCKER_WEB_VOLUME=.:/app
+
+export DRUSH_OPTIONS_URI="https://${COMPOSE_PROJECT_NAME}.docker.localhost"
+
+export MYSQL_DATABASE=app
+export MYSQL_PASSWORD=app
+export MYSQL_USER=app
+
+export DB_NAME="$MYSQL_DATABASE"
+export DB_PASSWORD="$MYSQL_PASSWORD"
+export DB_USER="$MYSQL_USER"
diff --git a/drupal-localgov/.githooks/prepare-commit-msg b/drupal-localgov/.githooks/prepare-commit-msg
new file mode 100755
index 0000000..6ff8ea0
--- /dev/null
+++ b/drupal-localgov/.githooks/prepare-commit-msg
@@ -0,0 +1,27 @@
+#!/usr/bin/env bash
+
+# Do not edit this file. It is automatically generated by https://www.oliverdavies.uk/build-configs.
+
+# Load the issue ID from an `.issue-id` file within the project and replace the
+# `ISSUE_ID` placeholder within a Git commit message.
+#
+# For example, running `echo "OD-123" > .issue-id` will add `Refs: OD-123` to
+# the commit message.
+#
+# This also works with multiple issue IDs in the same string, e.g.
+# "OD-123 OD-456", or IDs on multiple lines.
+
+set -o errexit
+set -o nounset
+set -o pipefail
+
+PROJECT_DIR=$(git rev-parse --show-toplevel)
+ISSUE_FILE="$PROJECT_DIR/.issue-id"
+
+if [ -f "${ISSUE_FILE}" ]; then
+ ISSUE_IDS=$(cat "${ISSUE_FILE}" | tr '\n' ',' | tr ' ' ',' | sed 's/,$//' | sed 's/,/, /g')
+
+ if [ -n "${ISSUE_IDS}" ]; then
+ sed -i.bak "s/# Refs:/Refs: $ISSUE_IDS/" "$1"
+ fi
+fi
diff --git a/drupal-localgov/.gitignore b/drupal-localgov/.gitignore
new file mode 100644
index 0000000..01d9ebb
--- /dev/null
+++ b/drupal-localgov/.gitignore
@@ -0,0 +1,42 @@
+# Do not edit this file. It is automatically generated by https://www.oliverdavies.uk/build-configs.
+
+.editorconfig
+.env
+.gitattributes
+.phpunit.result.cache
+vendor/
+web/.csslintrc
+web/.eslintignore
+web/.eslintrc.json
+web/.ht.router.php
+web/.htaccess
+web/INSTALL.txt
+web/README.md
+web/autoload.php
+web/core/
+web/example.gitignore
+web/index.php
+web/modules/README.txt
+web/modules/contrib/
+web/profiles/README.txt
+web/robots.txt
+web/sites/*/files/
+web/sites/*/private/
+web/sites/*/services*.yml
+web/sites/*/settings*.php
+web/sites/README.txt
+web/sites/default/default.services.yml
+web/sites/default/default.settings.php
+web/sites/development.services.yml
+web/sites/example.settings.local.php
+web/sites/example.sites.php
+web/sites/simpletest/
+web/themes/README.txt
+web/themes/contrib/
+web/update.php
+web/web.config
+
+# Docker.
+.env
+docker-compose.override.yaml
+
diff --git a/drupal-localgov/.hadolint.yaml b/drupal-localgov/.hadolint.yaml
new file mode 100644
index 0000000..d87bf88
--- /dev/null
+++ b/drupal-localgov/.hadolint.yaml
@@ -0,0 +1,2 @@
+ignore:
+ - DL3059
diff --git a/drupal-localgov/Dockerfile b/drupal-localgov/Dockerfile
new file mode 100644
index 0000000..b218199
--- /dev/null
+++ b/drupal-localgov/Dockerfile
@@ -0,0 +1,65 @@
+# Do not edit this file. It is automatically generated by https://www.oliverdavies.uk/build-configs.
+
+FROM php:8.1-fpm-bullseye AS base
+
+COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
+RUN which composer && composer -V
+
+ARG DOCKER_UID=1000
+ENV DOCKER_UID="${DOCKER_UID}"
+
+WORKDIR /app
+
+RUN adduser --disabled-password --uid "${DOCKER_UID}" app \
+ && chown app:app -R /app
+
+USER app
+
+ENV PATH="${PATH}:/app/bin:/app/vendor/bin"
+
+COPY --chown=app:app composer.* ./
+
+################################################################################
+
+FROM base AS build
+
+USER root
+
+
+RUN apt-get update -yqq \
+ && apt-get install -yqq --no-install-recommends \
+ git libpng-dev libjpeg-dev libzip-dev mariadb-client unzip \
+ && rm -rf /var/lib/apt/lists/* /usr/share/doc /usr/share/man \
+ && apt-get clean
+
+RUN docker-php-ext-configure gd --with-jpeg
+
+RUN docker-php-ext-install gd opcache pdo_mysql zip
+
+COPY --chown=app:app phpunit.xml* ./
+
+COPY --chown=app:app assets assets
+
+
+USER app
+
+RUN composer validate --strict
+RUN composer install
+
+COPY --chown=app:app tools/docker/images/php/root /
+
+ENTRYPOINT ["/usr/local/bin/docker-entrypoint-php"]
+CMD ["php-fpm"]
+
+
+
+
+################################################################################
+
+FROM nginx:1 as web
+
+EXPOSE 8080
+
+WORKDIR /app
+
+COPY tools/docker/images/web/root /
diff --git a/drupal-localgov/LICENSE b/drupal-localgov/LICENSE
new file mode 100644
index 0000000..23cb790
--- /dev/null
+++ b/drupal-localgov/LICENSE
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ {description}
+ Copyright (C) {year} {fullname}
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License along
+ with this program; if not, write to the Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ {signature of Ty Coon}, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.
diff --git a/drupal-localgov/README.md b/drupal-localgov/README.md
new file mode 100644
index 0000000..8d41de8
--- /dev/null
+++ b/drupal-localgov/README.md
@@ -0,0 +1,11 @@
+# docker-example-drupal-localgov
+
+## Installation
+
+```bash
+# With just
+just drush site:install -y --db-url=mysql://app:app@database/app localgov
+
+# Without just
+docker compose exec php drush site:install -y --db-url=mysql://app:app@database/app localgov
+```
diff --git a/drupal-localgov/README.original.md b/drupal-localgov/README.original.md
new file mode 100644
index 0000000..3382ba1
--- /dev/null
+++ b/drupal-localgov/README.original.md
@@ -0,0 +1,22 @@
+# LocalGov Drupal Composer project template
+
+
+
+A Composer-based installer for the LocalGov Drupal distribution.
+
+This project template should provide a kickstart for managing your site dependencies with Composer.
+
+## Usage
+
+For guidance on installing see:
+
+ - [Installing LocalGov Drupal locally with composer](https://github.com/localgovdrupal/localgov/blob/2.x/README.md#installing-localgov-drupal-locally-with-composer)
+ - [Getting started on LocalGov Drupal docs](https://docs.localgovdrupal.org/devs/getting-started/)
+
+## Maintainers
+
+This project is currently maintained by:
+
+ - Ekes: https://www.drupal.org/u/ekes
+ - Finn Lewis: https://www.drupal.org/u/finn-lewis
+ - Stephen Cox: https://www.drupal.org/u/stephen-cox
diff --git a/drupal-localgov/assets/composer/development.services.yml b/drupal-localgov/assets/composer/development.services.yml
new file mode 100644
index 0000000..f887b08
--- /dev/null
+++ b/drupal-localgov/assets/composer/development.services.yml
@@ -0,0 +1,13 @@
+# Local development services.
+#
+# To activate this feature, follow the instructions at the top of the
+# 'example.settings.local.php' file, which sits next to this file.
+parameters:
+ http.response.debug_cacheability_headers: true
+ twig.config:
+ debug: true
+ auto_reload: false
+ cache: false
+services:
+ cache.backend.null:
+ class: Drupal\Core\Cache\NullBackendFactory
diff --git a/drupal-localgov/assets/composer/settings.lando.php b/drupal-localgov/assets/composer/settings.lando.php
new file mode 100644
index 0000000..bfbf609
--- /dev/null
+++ b/drupal-localgov/assets/composer/settings.lando.php
@@ -0,0 +1,169 @@
+ 'database',
+ 'username' => 'database',
+ 'password' => 'database',
+ 'host' => 'database',
+ 'port' => '3306',
+ 'driver' => 'mysql',
+ 'prefix' => '',
+ 'collation' => 'utf8mb4_general_ci',
+);
+
+/**
+ * Error reporting.
+ *
+ * As a developer it is useful to see all errors. If the site you are working
+ * on has a lot of notice errors and you aren't able to fix them you can
+ * suppress them by modifying E_ALL in error_reporting to:
+ * E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
+ */
+error_reporting(E_ALL);
+ini_set('display_errors', TRUE);
+ini_set('display_startup_errors', TRUE);
+
+/**
+ * Stage file proxy.
+ *
+ * To use stage file proxy you will need the module enabled. Then uncomment
+ * the config line below and edit the domain to suit. If the domain is behind
+ * http auth then you can use agile:collective before the @ sign (or whatever
+ * user/pass combination you need). Change the domain.org part to match the
+ * domain (usually production, sometimes development) with the images.
+ */
+// $config['stage_file_proxy.settings']['origin'] = 'http://example.com';
+
diff --git a/drupal-localgov/assets/composer/settings.php b/drupal-localgov/assets/composer/settings.php
new file mode 100644
index 0000000..325e84f
--- /dev/null
+++ b/drupal-localgov/assets/composer/settings.php
@@ -0,0 +1,765 @@
+ 'databasename',
+ * 'username' => 'sqlusername',
+ * 'password' => 'sqlpassword',
+ * 'host' => 'localhost',
+ * 'port' => '3306',
+ * 'driver' => 'mysql',
+ * 'prefix' => '',
+ * 'collation' => 'utf8mb4_general_ci',
+ * ];
+ * @endcode
+ */
+$databases = [];
+
+/**
+ * Customizing database settings.
+ *
+ * Many of the values of the $databases array can be customized for your
+ * particular database system. Refer to the sample in the section above as a
+ * starting point.
+ *
+ * The "driver" property indicates what Drupal database driver the
+ * connection should use. This is usually the same as the name of the
+ * database type, such as mysql or sqlite, but not always. The other
+ * properties will vary depending on the driver. For SQLite, you must
+ * specify a database file name in a directory that is writable by the
+ * webserver. For most other drivers, you must specify a
+ * username, password, host, and database name.
+ *
+ * Transaction support is enabled by default for all drivers that support it,
+ * including MySQL. To explicitly disable it, set the 'transactions' key to
+ * FALSE.
+ * Note that some configurations of MySQL, such as the MyISAM engine, don't
+ * support it and will proceed silently even if enabled. If you experience
+ * transaction related crashes with such configuration, set the 'transactions'
+ * key to FALSE.
+ *
+ * For each database, you may optionally specify multiple "target" databases.
+ * A target database allows Drupal to try to send certain queries to a
+ * different database if it can but fall back to the default connection if not.
+ * That is useful for primary/replica replication, as Drupal may try to connect
+ * to a replica server when appropriate and if one is not available will simply
+ * fall back to the single primary server (The terms primary/replica are
+ * traditionally referred to as master/slave in database server documentation).
+ *
+ * The general format for the $databases array is as follows:
+ * @code
+ * $databases['default']['default'] = $info_array;
+ * $databases['default']['replica'][] = $info_array;
+ * $databases['default']['replica'][] = $info_array;
+ * $databases['extra']['default'] = $info_array;
+ * @endcode
+ *
+ * In the above example, $info_array is an array of settings described above.
+ * The first line sets a "default" database that has one primary database
+ * (the second level default). The second and third lines create an array
+ * of potential replica databases. Drupal will select one at random for a given
+ * request as needed. The fourth line creates a new database with a name of
+ * "extra".
+ *
+ * You can optionally set prefixes for some or all database table names
+ * by using the 'prefix' setting. If a prefix is specified, the table
+ * name will be prepended with its value. Be sure to use valid database
+ * characters only, usually alphanumeric and underscore. If no prefixes
+ * are desired, leave it as an empty string ''.
+ *
+ * To have all database names prefixed, set 'prefix' as a string:
+ * @code
+ * 'prefix' => 'main_',
+ * @endcode
+ *
+ * Per-table prefixes are deprecated as of Drupal 8.2, and will be removed in
+ * Drupal 9.0. After that, only a single prefix for all tables will be
+ * supported.
+ *
+ * To provide prefixes for specific tables, set 'prefix' as an array.
+ * The array's keys are the table names and the values are the prefixes.
+ * The 'default' element is mandatory and holds the prefix for any tables
+ * not specified elsewhere in the array. Example:
+ * @code
+ * 'prefix' => [
+ * 'default' => 'main_',
+ * 'users' => 'shared_',
+ * 'sessions' => 'shared_',
+ * 'role' => 'shared_',
+ * 'authmap' => 'shared_',
+ * ],
+ * @endcode
+ * You can also use a reference to a schema/database as a prefix. This may be
+ * useful if your Drupal installation exists in a schema that is not the default
+ * or you want to access several databases from the same code base at the same
+ * time.
+ * Example:
+ * @code
+ * 'prefix' => [
+ * 'default' => 'main.',
+ * 'users' => 'shared.',
+ * 'sessions' => 'shared.',
+ * 'role' => 'shared.',
+ * 'authmap' => 'shared.',
+ * ];
+ * @endcode
+ * NOTE: MySQL and SQLite's definition of a schema is a database.
+ *
+ * Advanced users can add or override initial commands to execute when
+ * connecting to the database server, as well as PDO connection settings. For
+ * example, to enable MySQL SELECT queries to exceed the max_join_size system
+ * variable, and to reduce the database connection timeout to 5 seconds:
+ * @code
+ * $databases['default']['default'] = [
+ * 'init_commands' => [
+ * 'big_selects' => 'SET SQL_BIG_SELECTS=1',
+ * ],
+ * 'pdo' => [
+ * PDO::ATTR_TIMEOUT => 5,
+ * ],
+ * ];
+ * @endcode
+ *
+ * WARNING: The above defaults are designed for database portability. Changing
+ * them may cause unexpected behavior, including potential data loss. See
+ * https://www.drupal.org/developing/api/database/configuration for more
+ * information on these defaults and the potential issues.
+ *
+ * More details can be found in the constructor methods for each driver:
+ * - \Drupal\Core\Database\Driver\mysql\Connection::__construct()
+ * - \Drupal\Core\Database\Driver\pgsql\Connection::__construct()
+ * - \Drupal\Core\Database\Driver\sqlite\Connection::__construct()
+ *
+ * Sample Database configuration format for PostgreSQL (pgsql):
+ * @code
+ * $databases['default']['default'] = [
+ * 'driver' => 'pgsql',
+ * 'database' => 'databasename',
+ * 'username' => 'sqlusername',
+ * 'password' => 'sqlpassword',
+ * 'host' => 'localhost',
+ * 'prefix' => '',
+ * ];
+ * @endcode
+ *
+ * Sample Database configuration format for SQLite (sqlite):
+ * @code
+ * $databases['default']['default'] = [
+ * 'driver' => 'sqlite',
+ * 'database' => '/path/to/databasefilename',
+ * ];
+ * @endcode
+ */
+
+/**
+ * Location of the site configuration files.
+ *
+ * The $settings['config_sync_directory'] specifies the location of file system
+ * directory used for syncing configuration data. On install, the directory is
+ * created. This is used for configuration imports.
+ *
+ * The default location for this directory is inside a randomly-named
+ * directory in the public files path. The setting below allows you to set
+ * its location.
+ */
+$settings['config_sync_directory'] = '../config/sync';
+
+/**
+ * Settings:
+ *
+ * $settings contains environment-specific configuration, such as the files
+ * directory and reverse proxy address, and temporary configuration, such as
+ * security overrides.
+ *
+ * @see \Drupal\Core\Site\Settings::get()
+ */
+
+/**
+ * Salt for one-time login links, cancel links, form tokens, etc.
+ *
+ * This variable will be set to a random value by the installer. All one-time
+ * login links will be invalidated if the value is changed. Note that if your
+ * site is deployed on a cluster of web servers, you must ensure that this
+ * variable has the same value on each server.
+ *
+ * For enhanced security, you may set this variable to the contents of a file
+ * outside your document root; you should also ensure that this file is not
+ * stored with backups of your database.
+ *
+ * Example:
+ * @code
+ * $settings['hash_salt'] = file_get_contents('/home/example/salt.txt');
+ * @endcode
+ */
+$settings['hash_salt'] = 'SOelBL-o8b_k0BIJBRC7piYZxDFPFjnsRANJW7t9xJJEXidbTDKDBYzUxXsejPEEgJg_wSfXIQ';
+
+/**
+ * Deployment identifier.
+ *
+ * Drupal's dependency injection container will be automatically invalidated and
+ * rebuilt when the Drupal core version changes. When updating contributed or
+ * custom code that changes the container, changing this identifier will also
+ * allow the container to be invalidated as soon as code is deployed.
+ */
+# $settings['deployment_identifier'] = \Drupal::VERSION;
+
+/**
+ * Access control for update.php script.
+ *
+ * If you are updating your Drupal installation using the update.php script but
+ * are not logged in using either an account with the "Administer software
+ * updates" permission or the site maintenance account (the account that was
+ * created during installation), you will need to modify the access check
+ * statement below. Change the FALSE to a TRUE to disable the access check.
+ * After finishing the upgrade, be sure to open this file again and change the
+ * TRUE back to a FALSE!
+ */
+$settings['update_free_access'] = FALSE;
+
+/**
+ * External access proxy settings:
+ *
+ * If your site must access the Internet via a web proxy then you can enter the
+ * proxy settings here. Set the full URL of the proxy, including the port, in
+ * variables:
+ * - $settings['http_client_config']['proxy']['http']: The proxy URL for HTTP
+ * requests.
+ * - $settings['http_client_config']['proxy']['https']: The proxy URL for HTTPS
+ * requests.
+ * You can pass in the user name and password for basic authentication in the
+ * URLs in these settings.
+ *
+ * You can also define an array of host names that can be accessed directly,
+ * bypassing the proxy, in $settings['http_client_config']['proxy']['no'].
+ */
+# $settings['http_client_config']['proxy']['http'] = 'http://proxy_user:proxy_pass@example.com:8080';
+# $settings['http_client_config']['proxy']['https'] = 'http://proxy_user:proxy_pass@example.com:8080';
+# $settings['http_client_config']['proxy']['no'] = ['127.0.0.1', 'localhost'];
+
+/**
+ * Reverse Proxy Configuration:
+ *
+ * Reverse proxy servers are often used to enhance the performance
+ * of heavily visited sites and may also provide other site caching,
+ * security, or encryption benefits. In an environment where Drupal
+ * is behind a reverse proxy, the real IP address of the client should
+ * be determined such that the correct client IP address is available
+ * to Drupal's logging, statistics, and access management systems. In
+ * the most simple scenario, the proxy server will add an
+ * X-Forwarded-For header to the request that contains the client IP
+ * address. However, HTTP headers are vulnerable to spoofing, where a
+ * malicious client could bypass restrictions by setting the
+ * X-Forwarded-For header directly. Therefore, Drupal's proxy
+ * configuration requires the IP addresses of all remote proxies to be
+ * specified in $settings['reverse_proxy_addresses'] to work correctly.
+ *
+ * Enable this setting to get Drupal to determine the client IP from the
+ * X-Forwarded-For header. If you are unsure about this setting, do not have a
+ * reverse proxy, or Drupal operates in a shared hosting environment, this
+ * setting should remain commented out.
+ *
+ * In order for this setting to be used you must specify every possible
+ * reverse proxy IP address in $settings['reverse_proxy_addresses'].
+ * If a complete list of reverse proxies is not available in your
+ * environment (for example, if you use a CDN) you may set the
+ * $_SERVER['REMOTE_ADDR'] variable directly in settings.php.
+ * Be aware, however, that it is likely that this would allow IP
+ * address spoofing unless more advanced precautions are taken.
+ */
+# $settings['reverse_proxy'] = TRUE;
+
+/**
+ * Specify every reverse proxy IP address in your environment.
+ * This setting is required if $settings['reverse_proxy'] is TRUE.
+ */
+# $settings['reverse_proxy_addresses'] = ['a.b.c.d', ...];
+
+/**
+ * Reverse proxy trusted headers.
+ *
+ * Sets which headers to trust from your reverse proxy.
+ *
+ * Common values are:
+ * - \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_ALL
+ * - \Symfony\Component\HttpFoundation\Request::HEADER_FORWARDED
+ *
+ * Note the default value of
+ * @code
+ * \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_ALL | \Symfony\Component\HttpFoundation\Request::HEADER_FORWARDED
+ * @endcode
+ * is not secure by default. The value should be set to only the specific
+ * headers the reverse proxy uses. For example:
+ * @code
+ * \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_ALL
+ * @endcode
+ * This would trust the following headers:
+ * - X_FORWARDED_FOR
+ * - X_FORWARDED_HOST
+ * - X_FORWARDED_PROTO
+ * - X_FORWARDED_PORT
+ *
+ * @see \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_ALL
+ * @see \Symfony\Component\HttpFoundation\Request::HEADER_FORWARDED
+ * @see \Symfony\Component\HttpFoundation\Request::setTrustedProxies
+ */
+# $settings['reverse_proxy_trusted_headers'] = \Symfony\Component\HttpFoundation\Request::HEADER_X_FORWARDED_ALL | \Symfony\Component\HttpFoundation\Request::HEADER_FORWARDED;
+
+
+/**
+ * Page caching:
+ *
+ * By default, Drupal sends a "Vary: Cookie" HTTP header for anonymous page
+ * views. This tells a HTTP proxy that it may return a page from its local
+ * cache without contacting the web server, if the user sends the same Cookie
+ * header as the user who originally requested the cached page. Without "Vary:
+ * Cookie", authenticated users would also be served the anonymous page from
+ * the cache. If the site has mostly anonymous users except a few known
+ * editors/administrators, the Vary header can be omitted. This allows for
+ * better caching in HTTP proxies (including reverse proxies), i.e. even if
+ * clients send different cookies, they still get content served from the cache.
+ * However, authenticated users should access the site directly (i.e. not use an
+ * HTTP proxy, and bypass the reverse proxy if one is used) in order to avoid
+ * getting cached pages from the proxy.
+ */
+# $settings['omit_vary_cookie'] = TRUE;
+
+
+/**
+ * Cache TTL for client error (4xx) responses.
+ *
+ * Items cached per-URL tend to result in a large number of cache items, and
+ * this can be problematic on 404 pages which by their nature are unbounded. A
+ * fixed TTL can be set for these items, defaulting to one hour, so that cache
+ * backends which do not support LRU can purge older entries. To disable caching
+ * of client error responses set the value to 0. Currently applies only to
+ * page_cache module.
+ */
+# $settings['cache_ttl_4xx'] = 3600;
+
+/**
+ * Expiration of cached forms.
+ *
+ * Drupal's Form API stores details of forms in a cache and these entries are
+ * kept for at least 6 hours by default. Expired entries are cleared by cron.
+ *
+ * @see \Drupal\Core\Form\FormCache::setCache()
+ */
+# $settings['form_cache_expiration'] = 21600;
+
+/**
+ * Class Loader.
+ *
+ * If the APC extension is detected, the Symfony APC class loader is used for
+ * performance reasons. Detection can be prevented by setting
+ * class_loader_auto_detect to false, as in the example below.
+ */
+# $settings['class_loader_auto_detect'] = FALSE;
+
+/*
+ * If the APC extension is not detected, either because APC is missing or
+ * because auto-detection has been disabled, auto-loading falls back to
+ * Composer's ClassLoader, which is good for development as it does not break
+ * when code is moved in the file system. You can also decorate the base class
+ * loader with another cached solution than the Symfony APC class loader, as
+ * all production sites should have a cached class loader of some sort enabled.
+ *
+ * To do so, you may decorate and replace the local $class_loader variable. For
+ * example, to use Symfony's APC class loader without automatic detection,
+ * uncomment the code below.
+ */
+/*
+if ($settings['hash_salt']) {
+ $prefix = 'drupal.' . hash('sha256', 'drupal.' . $settings['hash_salt']);
+ $apc_loader = new \Symfony\Component\ClassLoader\ApcClassLoader($prefix, $class_loader);
+ unset($prefix);
+ $class_loader->unregister();
+ $apc_loader->register();
+ $class_loader = $apc_loader;
+}
+*/
+
+/**
+ * Authorized file system operations:
+ *
+ * The Update Manager module included with Drupal provides a mechanism for
+ * site administrators to securely install missing updates for the site
+ * directly through the web user interface. On securely-configured servers,
+ * the Update manager will require the administrator to provide SSH or FTP
+ * credentials before allowing the installation to proceed; this allows the
+ * site to update the new files as the user who owns all the Drupal files,
+ * instead of as the user the webserver is running as. On servers where the
+ * webserver user is itself the owner of the Drupal files, the administrator
+ * will not be prompted for SSH or FTP credentials (note that these server
+ * setups are common on shared hosting, but are inherently insecure).
+ *
+ * Some sites might wish to disable the above functionality, and only update
+ * the code directly via SSH or FTP themselves. This setting completely
+ * disables all functionality related to these authorized file operations.
+ *
+ * @see https://www.drupal.org/node/244924
+ *
+ * Remove the leading hash signs to disable.
+ */
+# $settings['allow_authorize_operations'] = FALSE;
+
+/**
+ * Default mode for directories and files written by Drupal.
+ *
+ * Value should be in PHP Octal Notation, with leading zero.
+ */
+# $settings['file_chmod_directory'] = 0775;
+# $settings['file_chmod_file'] = 0664;
+
+/**
+ * Public file base URL:
+ *
+ * An alternative base URL to be used for serving public files. This must
+ * include any leading directory path.
+ *
+ * A different value from the domain used by Drupal to be used for accessing
+ * public files. This can be used for a simple CDN integration, or to improve
+ * security by serving user-uploaded files from a different domain or subdomain
+ * pointing to the same server. Do not include a trailing slash.
+ */
+# $settings['file_public_base_url'] = 'http://downloads.example.com/files';
+
+/**
+ * Public file path:
+ *
+ * A local file system path where public files will be stored. This directory
+ * must exist and be writable by Drupal. This directory must be relative to
+ * the Drupal installation directory and be accessible over the web.
+ */
+# $settings['file_public_path'] = 'sites/default/files';
+
+/**
+ * Private file path:
+ *
+ * A local file system path where private files will be stored. This directory
+ * must be absolute, outside of the Drupal installation directory and not
+ * accessible over the web.
+ *
+ * Note: Caches need to be cleared when this value is changed to make the
+ * private:// stream wrapper available to the system.
+ *
+ * See https://www.drupal.org/documentation/modules/file for more information
+ * about securing private files.
+ */
+# $settings['file_private_path'] = '';
+
+/**
+ * Temporary file path:
+ *
+ * A local file system path where temporary files will be stored. This directory
+ * must be absolute, outside of the Drupal installation directory and not
+ * accessible over the web.
+ *
+ * If this is not set, the default for the operating system will be used.
+ *
+ * @see \Drupal\Component\FileSystem\FileSystem::getOsTemporaryDirectory()
+ */
+# $settings['file_temp_path'] = '/tmp';
+
+/**
+ * Session write interval:
+ *
+ * Set the minimum interval between each session write to database.
+ * For performance reasons it defaults to 180.
+ */
+# $settings['session_write_interval'] = 180;
+
+/**
+ * String overrides:
+ *
+ * To override specific strings on your site with or without enabling the Locale
+ * module, add an entry to this list. This functionality allows you to change
+ * a small number of your site's default English language interface strings.
+ *
+ * Remove the leading hash signs to enable.
+ *
+ * The "en" part of the variable name, is dynamic and can be any langcode of
+ * any added language. (eg locale_custom_strings_de for german).
+ */
+# $settings['locale_custom_strings_en'][''] = [
+# 'forum' => 'Discussion board',
+# '@count min' => '@count minutes',
+# ];
+
+/**
+ * A custom theme for the offline page:
+ *
+ * This applies when the site is explicitly set to maintenance mode through the
+ * administration page or when the database is inactive due to an error.
+ * The template file should also be copied into the theme. It is located inside
+ * 'core/modules/system/templates/maintenance-page.html.twig'.
+ *
+ * Note: This setting does not apply to installation and update pages.
+ */
+# $settings['maintenance_theme'] = 'bartik';
+
+/**
+ * PHP settings:
+ *
+ * To see what PHP settings are possible, including whether they can be set at
+ * runtime (by using ini_set()), read the PHP documentation:
+ * http://php.net/manual/ini.list.php
+ * See \Drupal\Core\DrupalKernel::bootEnvironment() for required runtime
+ * settings and the .htaccess file for non-runtime settings.
+ * Settings defined there should not be duplicated here so as to avoid conflict
+ * issues.
+ */
+
+/**
+ * If you encounter a situation where users post a large amount of text, and
+ * the result is stripped out upon viewing but can still be edited, Drupal's
+ * output filter may not have sufficient memory to process it. If you
+ * experience this issue, you may wish to uncomment the following two lines
+ * and increase the limits of these variables. For more information, see
+ * http://php.net/manual/pcre.configuration.php.
+ */
+# ini_set('pcre.backtrack_limit', 200000);
+# ini_set('pcre.recursion_limit', 200000);
+
+/**
+ * Configuration overrides.
+ *
+ * To globally override specific configuration values for this site,
+ * set them here. You usually don't need to use this feature. This is
+ * useful in a configuration file for a vhost or directory, rather than
+ * the default settings.php.
+ *
+ * Note that any values you provide in these variable overrides will not be
+ * viewable from the Drupal administration interface. The administration
+ * interface displays the values stored in configuration so that you can stage
+ * changes to other environments that don't have the overrides.
+ *
+ * There are particular configuration values that are risky to override. For
+ * example, overriding the list of installed modules in 'core.extension' is not
+ * supported as module install or uninstall has not occurred. Other examples
+ * include field storage configuration, because it has effects on database
+ * structure, and 'core.menu.static_menu_link_overrides' since this is cached in
+ * a way that is not config override aware. Also, note that changing
+ * configuration values in settings.php will not fire any of the configuration
+ * change events.
+ */
+# $config['system.site']['name'] = 'My Drupal site';
+# $config['user.settings']['anonymous'] = 'Visitor';
+
+/**
+ * Fast 404 pages:
+ *
+ * Drupal can generate fully themed 404 pages. However, some of these responses
+ * are for images or other resource files that are not displayed to the user.
+ * This can waste bandwidth, and also generate server load.
+ *
+ * The options below return a simple, fast 404 page for URLs matching a
+ * specific pattern:
+ * - $config['system.performance']['fast_404']['exclude_paths']: A regular
+ * expression to match paths to exclude, such as images generated by image
+ * styles, or dynamically-resized images. The default pattern provided below
+ * also excludes the private file system. If you need to add more paths, you
+ * can add '|path' to the expression.
+ * - $config['system.performance']['fast_404']['paths']: A regular expression to
+ * match paths that should return a simple 404 page, rather than the fully
+ * themed 404 page. If you don't have any aliases ending in htm or html you
+ * can add '|s?html?' to the expression.
+ * - $config['system.performance']['fast_404']['html']: The html to return for
+ * simple 404 pages.
+ *
+ * Remove the leading hash signs if you would like to alter this functionality.
+ */
+# $config['system.performance']['fast_404']['exclude_paths'] = '/\/(?:styles)|(?:system\/files)\//';
+# $config['system.performance']['fast_404']['paths'] = '/\.(?:txt|png|gif|jpe?g|css|js|ico|swf|flv|cgi|bat|pl|dll|exe|asp)$/i';
+# $config['system.performance']['fast_404']['html'] = '
404 Not FoundNot Found
The requested URL "@path" was not found on this server.
';
+
+/**
+ * Load services definition file.
+ */
+$settings['container_yamls'][] = $app_root . '/' . $site_path . '/services.yml';
+
+/**
+ * Override the default service container class.
+ *
+ * This is useful for example to trace the service container for performance
+ * tracking purposes, for testing a service container with an error condition or
+ * to test a service container that throws an exception.
+ */
+# $settings['container_base_class'] = '\Drupal\Core\DependencyInjection\Container';
+
+/**
+ * Override the default yaml parser class.
+ *
+ * Provide a fully qualified class name here if you would like to provide an
+ * alternate implementation YAML parser. The class must implement the
+ * \Drupal\Component\Serialization\SerializationInterface interface.
+ */
+# $settings['yaml_parser_class'] = NULL;
+
+/**
+ * Trusted host configuration.
+ *
+ * Drupal core can use the Symfony trusted host mechanism to prevent HTTP Host
+ * header spoofing.
+ *
+ * To enable the trusted host mechanism, you enable your allowable hosts
+ * in $settings['trusted_host_patterns']. This should be an array of regular
+ * expression patterns, without delimiters, representing the hosts you would
+ * like to allow.
+ *
+ * For example:
+ * @code
+ * $settings['trusted_host_patterns'] = [
+ * '^www\.example\.com$',
+ * ];
+ * @endcode
+ * will allow the site to only run from www.example.com.
+ *
+ * If you are running multisite, or if you are running your site from
+ * different domain names (eg, you don't redirect http://www.example.com to
+ * http://example.com), you should specify all of the host patterns that are
+ * allowed by your site.
+ *
+ * For example:
+ * @code
+ * $settings['trusted_host_patterns'] = [
+ * '^example\.com$',
+ * '^.+\.example\.com$',
+ * '^example\.org$',
+ * '^.+\.example\.org$',
+ * ];
+ * @endcode
+ * will allow the site to run off of all variants of example.com and
+ * example.org, with all subdomains included.
+ */
+
+/**
+ * The default list of directories that will be ignored by Drupal's file API.
+ *
+ * By default ignore node_modules and bower_components folders to avoid issues
+ * with common frontend tools and recursive scanning of directories looking for
+ * extensions.
+ *
+ * @see \Drupal\Core\File\FileSystemInterface::scanDirectory()
+ * @see \Drupal\Core\Extension\ExtensionDiscovery::scanDirectory()
+ */
+$settings['file_scan_ignore_directories'] = [
+ 'node_modules',
+ 'bower_components',
+];
+
+/**
+ * The default number of entities to update in a batch process.
+ *
+ * This is used by update and post-update functions that need to go through and
+ * change all the entities on a site, so it is useful to increase this number
+ * if your hosting configuration (i.e. RAM allocation, CPU speed) allows for a
+ * larger number of entities to be processed in a single batch run.
+ */
+$settings['entity_update_batch_size'] = 50;
+
+/**
+ * Entity update backup.
+ *
+ * This is used to inform the entity storage handler that the backup tables as
+ * well as the original entity type and field storage definitions should be
+ * retained after a successful entity update process.
+ */
+$settings['entity_update_backup'] = TRUE;
+
+/**
+ * Load local development override configuration, if available.
+ *
+ * Use settings.local.php to override variables on secondary (staging,
+ * development, etc) installations of this site. Typically used to disable
+ * caching, JavaScript/CSS compression, re-routing of outgoing emails, and
+ * other things that should not happen on development and testing sites.
+ *
+ * Keep this code block at the end of this file to take full effect.
+ */
+if (file_exists($app_root . '/' . $site_path . '/settings.local.php')) {
+ include $app_root . '/' . $site_path . '/settings.local.php';
+}
+elseif (getenv('LANDO_SERVICE_NAME') == 'appserver' && file_exists($app_root . '/' . $site_path . '/settings.lando.php')) {
+ include $app_root . '/' . $site_path . '/settings.lando.php';
+}
+
+// Automatically generated include for settings managed by ddev.
+$ddev_settings = dirname(__FILE__) . '/settings.ddev.php';
+if (getenv('IS_DDEV_PROJECT') == 'true' && is_readable($ddev_settings)) {
+ require $ddev_settings;
+}
diff --git a/drupal-localgov/build.yaml b/drupal-localgov/build.yaml
new file mode 100644
index 0000000..326865d
--- /dev/null
+++ b/drupal-localgov/build.yaml
@@ -0,0 +1,37 @@
+name: docker-example-drupal-localgov
+language: php
+type: drupal
+
+web:
+ type: nginx
+
+database:
+ type: mariadb
+ version: 10
+
+php:
+ version: 8.1-fpm-bullseye
+ phpcs: false
+ phpstan: false
+ phpunit: false
+
+drupal:
+ docroot: web
+
+docker-compose:
+ services:
+ - database
+ - php
+ - web
+
+dockerfile:
+ stages:
+ build:
+ commands:
+ - composer validate --strict
+ - composer install
+ extra_directories:
+ - assets
+
+experimental:
+ useNewDatabaseCredentials: true
diff --git a/drupal-localgov/composer.json b/drupal-localgov/composer.json
new file mode 100644
index 0000000..1aeaab0
--- /dev/null
+++ b/drupal-localgov/composer.json
@@ -0,0 +1,81 @@
+{
+ "name": "localgovdrupal/localgov-project",
+ "description": "Project template for the LocalGov Drupal distribution.",
+ "type": "project",
+ "license": "GPL-2.0-or-later",
+ "homepage": "https://github.com/localgovdrupal/localgov_project",
+ "repositories": {
+ "drupal": {
+ "type": "composer",
+ "url": "https://packages.drupal.org/8"
+ }
+ },
+ "require": {
+ "composer/installers": "^1.10",
+ "cweagans/composer-patches": "^1.6",
+ "drupal/core-composer-scaffold": "^10.0",
+ "drupal/core-recommended": "^10.0",
+ "localgovdrupal/localgov": "3.x",
+ "localgovdrupal/localgov_search_solr": "dev-feature/drupal-10 as 1.1.0-alpha1"
+ },
+ "require-dev": {
+ "brianium/paratest": "^6.0",
+ "drupal/coder": "^8.3",
+ "drupal/core-dev": "^10.0",
+ "mglaman/phpstan-drupal": "^1.0",
+ "phpspec/prophecy-phpunit": "^2",
+ "phpstan/phpstan": "^1.0",
+ "phpstan/phpstan-deprecation-rules": "^1.0",
+ "squizlabs/php_codesniffer": "^3.6"
+ },
+ "conflict": {
+ "drupal/drupal": "*"
+ },
+ "minimum-stability": "dev",
+ "prefer-stable": true,
+ "config": {
+ "sort-packages": true,
+ "bin-dir": "bin/",
+ "allow-plugins": {
+ "composer/installers": true,
+ "cweagans/composer-patches": true,
+ "drupal/core-composer-scaffold": true,
+ "drupal/core-project-message": true,
+ "phpstan/extension-installer": true,
+ "dealerdirect/phpcodesniffer-composer-installer": true,
+ "php-http/discovery": true
+ }
+ },
+ "extra": {
+ "enable-patching": true,
+ "drupal-scaffold": {
+ "locations": {
+ "web-root": "web/"
+ },
+ "file-mapping": {
+ "[web-root]/sites/default/settings.php": {
+ "mode": "replace",
+ "path": "assets/composer/settings.php",
+ "overwrite": false
+ },
+ "[web-root]/sites/default/settings.lando.php": {
+ "mode": "replace",
+ "path": "assets/composer/settings.lando.php",
+ "overwrite": false
+ },
+ "[web-root]/sites/development.services.yml": "assets/composer/development.services.yml"
+ }
+ },
+ "installer-paths": {
+ "web/core": ["type:drupal-core"],
+ "web/libraries/{$name}": ["type:drupal-library"],
+ "web/modules/contrib/{$name}": ["type:drupal-module"],
+ "web/profiles/contrib/{$name}": ["type:drupal-profile"],
+ "web/themes/contrib/{$name}": ["type:drupal-theme"],
+ "drush/Commands/contrib/{$name}": ["type:drupal-drush"],
+ "web/modules/custom/{$name}": ["type:drupal-custom-module"],
+ "web/themes/custom/{$name}": ["type:drupal-custom-theme"]
+ }
+
+ }
+}
diff --git a/drupal-localgov/config/sync/.htaccess b/drupal-localgov/config/sync/.htaccess
new file mode 100644
index 0000000..c323d54
--- /dev/null
+++ b/drupal-localgov/config/sync/.htaccess
@@ -0,0 +1,27 @@
+# Deny all requests from Apache 2.4+.
+
+ Require all denied
+
+
+# Deny all requests from Apache 2.0-2.2.
+
+ Deny from all
+
+
+# Turn off all options we don't need.
+Options -Indexes -ExecCGI -Includes -MultiViews
+
+# Set the catch-all handler to prevent scripts from being executed.
+SetHandler Drupal_Security_Do_Not_Remove_See_SA_2006_006
+
+ # Override the handler again if we're run later in the evaluation list.
+ SetHandler Drupal_Security_Do_Not_Remove_See_SA_2013_003
+
+
+# If we know how to do it safely, disable the PHP engine entirely.
+
+ php_flag engine off
+
+
+ php_flag engine off
+
\ No newline at end of file
diff --git a/drupal-localgov/docker-compose.yaml b/drupal-localgov/docker-compose.yaml
new file mode 100644
index 0000000..dcbebe0
--- /dev/null
+++ b/drupal-localgov/docker-compose.yaml
@@ -0,0 +1,79 @@
+# Do not edit this file. It is automatically generated by https://www.oliverdavies.uk/build-configs.
+
+x-proxy: &default-proxy
+ networks:
+ - default
+ - proxy
+ labels:
+ - "traefik.enable=true"
+ - "traefik.docker.network=traefik_proxy"
+ - "traefik.http.routers.${COMPOSE_PROJECT_NAME}.rule=Host(
+ `${COMPOSE_PROJECT_NAME}.docker.localhost`,
+ )"
+ - "traefik.http.routers.${COMPOSE_PROJECT_NAME}.tls=true"
+
+x-app: &default-app
+ volumes:
+ - "${DOCKER_WEB_VOLUME:-./web:/app/web}"
+ env_file:
+ - .env
+ restart: "${DOCKER_RESTART_POLICY:-unless-stopped}"
+ networks:
+ - default
+ deploy:
+ resources:
+ limits:
+ cpus: "${DOCKER_MYSQL_CPUS:-0}"
+ memory: "${DOCKER_MYSQL_MEMORY:-0}"
+ labels:
+ - "traefik.enable=false"
+ tty: true
+
+services:
+ web:
+ <<: [*default-proxy, *default-app]
+ build:
+ context: .
+ target: web
+ depends_on:
+ - php
+ profiles: [web]
+
+ php:
+ <<: [*default-app]
+ build:
+ context: .
+ target: build
+ args:
+ - "DOCKER_UID=${DOCKER_UID:-1000}"
+ volumes:
+ - .:/app
+ depends_on:
+ - database
+ profiles: [php]
+
+ database:
+ image: mariadb:10
+ deploy:
+ resources:
+ limits:
+ cpus: "${DOCKER_MYSQL_CPUS:-0}"
+ memory: "${DOCKER_MYSQL_MEMORY:-0}"
+ volumes:
+ - db-data:/var/lib/mysql
+
+ env_file:
+ - .env
+ labels:
+ - "traefik.enable=false"
+ environment:
+ MYSQL_RANDOM_ROOT_PASSWORD: true
+ profiles: [database]
+
+volumes:
+ db-data: {}
+
+networks:
+ proxy:
+ external: true
+ name: traefik_proxy
diff --git a/drupal-localgov/phpcs.xml.dist b/drupal-localgov/phpcs.xml.dist
new file mode 100644
index 0000000..5613bdb
--- /dev/null
+++ b/drupal-localgov/phpcs.xml.dist
@@ -0,0 +1,31 @@
+
+
+
+
+ PHPCS configuration file for docker-example-drupal-localgov.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/drupal-localgov/phpstan.neon b/drupal-localgov/phpstan.neon
new file mode 100644
index 0000000..d4a500a
--- /dev/null
+++ b/drupal-localgov/phpstan.neon
@@ -0,0 +1,12 @@
+parameters:
+ customRulesetUsed: true
+ reportUnmatchedIgnoredErrors: false
+ # Ignore phpstan-drupal extension's rules.
+ ignoreErrors:
+ - '#\Drupal calls should be avoided in classes, use dependency injection instead#'
+ - '#Plugin definitions cannot be altered.#'
+ - '#Missing cache backend declaration for performance.#'
+ - '#Plugin manager has cache backend specified but does not declare cache tags.#'
+#includes:
+# - vendor/mglaman/phpstan-drupal/extension.neon
+# - vendor/phpstan/phpstan-deprecation-rules/rules.neon
diff --git a/drupal-localgov/phpstan.neon.dist b/drupal-localgov/phpstan.neon.dist
new file mode 100644
index 0000000..f2d48e1
--- /dev/null
+++ b/drupal-localgov/phpstan.neon.dist
@@ -0,0 +1,9 @@
+# Do not edit this file. It is automatically generated by https://www.oliverdavies.uk/build-configs.
+
+parameters:
+ level: max
+ excludePaths:
+ - *Test.php
+ - *TestBase.php
+ paths:
+
diff --git a/drupal-localgov/phpunit.xml.dist b/drupal-localgov/phpunit.xml.dist
new file mode 100644
index 0000000..179546d
--- /dev/null
+++ b/drupal-localgov/phpunit.xml.dist
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ./web/modules/custom/**/tests/**/Functional
+
+
+ ./web/modules/custom/**/tests/**/Kernel
+
+
+ ./web/modules/custom/**/tests/**/Unit
+
+
+
diff --git a/drupal-localgov/run b/drupal-localgov/run
new file mode 100755
index 0000000..8ae65d7
--- /dev/null
+++ b/drupal-localgov/run
@@ -0,0 +1,130 @@
+#!/usr/bin/env bash
+
+# Do not edit this file. It is automatically generated by https://www.oliverdavies.uk/build-configs.
+
+set -o errexit
+set -o pipefail
+
+# If we're running in CI we need to disable TTY allocation for docker compose
+# commands that enable it by default, such as exec and run.
+TTY="${TTY:-}"
+if [[ ! -t 1 ]]; then
+ TTY="-T"
+fi
+
+# Run automated tests as part of the Continuous Integration (CI) pipeline.
+function ci:test {
+ lint:dockerfile
+
+ docker compose version
+
+ docker network create traefik_proxy || true
+
+ cp --no-clobber .env.example .env || true
+
+ docker compose build --progress plain
+
+ docker compose up --detach
+ docker compose logs
+
+ composer install --quiet --no-progress
+
+
+}
+
+# Run a command within the php container.
+function cmd {
+ docker compose exec php "${@}"
+}
+
+
+# Execute any Composer command.
+function composer {
+ _exec php composer "${@}"
+}
+
+# Connect to the database.
+function db {
+ [[ -f ".env" ]] && source .env
+
+ docker compose exec database mysql -u"$DB_USER" -p"$DB_PASSWORD" "$DB_NAME"
+}
+
+# Execute any Drush command.
+function drush {
+ _exec php drush "${@}"
+}
+
+# Disable Git hooks.
+function git-hooks:off {
+ git config --unset core.hooksPath
+}
+
+# Enable Git hooks.
+function git-hooks:on {
+ git config core.hooksPath .githooks
+}
+
+# Display a list of all available commands.
+function help {
+ printf "%s [args]\n\nTasks:\n" "${0}"
+
+ compgen -A function | grep -v "^_" | cat -n
+
+ printf "\nExtended help:\n Each task has comments for general usage\n"
+}
+
+# Install Drupal.
+function install {
+ drush site:install -y "${@}"
+}
+
+# Lint the Dockerfile.
+function lint:dockerfile {
+ docker container run --rm -i \
+ hadolint/hadolint hadolint --ignore DL3008 --ignore DL3022 --ignore DL3059 -t style "${@}" - < Dockerfile
+}
+
+
+# Start the project.
+function start {
+ cp -v --no-clobber .env.example .env || true
+
+ docker compose up -d
+}
+
+
+function stop {
+ docker compose down
+}
+
+
+function test:commit {
+
+ quality
+}
+
+function _exec {
+ docker compose exec ${TTY} "${@}"
+}
+
+function _run {
+ local service="${1}"
+ local command="${2}"
+
+ docker compose run \
+ --entrypoint "${command}" \
+ --no-deps \
+ --rm \
+ ${TTY} \
+ "${service}" "${@}"
+}
+
+# Include any local tasks.
+# https://stackoverflow.com/a/6659698
+[[ -e "${BASH_SOURCE%/*}/run.local" ]] && source "${BASH_SOURCE%/*}/run.local"
+
+TIMEFORMAT=$'\nTask completed in %3lR'
+time "${@:-help}"
+
+# vim: ft=bash
diff --git a/drupal-localgov/tools/docker/images/php/root/usr/local/bin/docker-entrypoint-php b/drupal-localgov/tools/docker/images/php/root/usr/local/bin/docker-entrypoint-php
new file mode 100755
index 0000000..dbd9900
--- /dev/null
+++ b/drupal-localgov/tools/docker/images/php/root/usr/local/bin/docker-entrypoint-php
@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+
+# Do not edit this file. It is automatically generated by https://www.oliverdavies.uk/build-configs.
+
+[[ -f composer.json && ! -d vendor ]] && composer install
+
+eval "$@"
diff --git a/drupal-localgov/tools/docker/images/php/root/usr/local/etc/php/php.ini b/drupal-localgov/tools/docker/images/php/root/usr/local/etc/php/php.ini
new file mode 100644
index 0000000..aa883a1
--- /dev/null
+++ b/drupal-localgov/tools/docker/images/php/root/usr/local/etc/php/php.ini
@@ -0,0 +1,4 @@
+# Do not edit this file. It is automatically generated by https://www.oliverdavies.uk/build-configs.
+
+max_vars_input = 1000
+memory_limit = 128M
diff --git a/drupal-localgov/tools/docker/images/web/root/etc/nginx/conf.d/default.conf b/drupal-localgov/tools/docker/images/web/root/etc/nginx/conf.d/default.conf
new file mode 100644
index 0000000..13e395a
--- /dev/null
+++ b/drupal-localgov/tools/docker/images/web/root/etc/nginx/conf.d/default.conf
@@ -0,0 +1,22 @@
+# Do not edit this file. It is automatically generated by https://www.oliverdavies.uk/build-configs.
+
+server {
+ server_name _;
+
+ root /app/web;
+
+ location / {
+ try_files $uri /index.php?$query_string;
+ }
+
+ location ~ \.php(/|$) {
+ fastcgi_split_path_info ^(.+?\.php)(|/.*)$;
+ try_files $fastcgi_script_name =404;
+ include fastcgi_params;
+ fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
+ fastcgi_param PATH_INFO $fastcgi_path_info;
+ fastcgi_param QUERY_STRING $query_string;
+ fastcgi_intercept_errors on;
+ fastcgi_pass php:9000;
+ }
+}