├── 1_create_package ├── nomad │ └── put_nomad_binary_here └── ui │ ├── nomad-120.png │ ├── nomad-16.png │ ├── nomad-192.png │ ├── nomad-24.png │ ├── nomad-256.png │ ├── nomad-32.png │ ├── nomad-48.png │ ├── nomad-64.png │ ├── nomad-72.png │ ├── nomad-90.png │ └── config ├── 2_create_project ├── conf │ ├── resource │ └── resource.own ├── PACKAGE_ICON.PNG ├── scripts │ ├── postinst │ ├── preinst │ ├── postuninst │ ├── postupgrade │ ├── preuninst │ ├── preupgrade │ ├── nomad.sc │ ├── installer │ └── start-stop-status ├── PACKAGE_ICON_120.PNG ├── PACKAGE_ICON_256.PNG └── INFO ├── .gitignore ├── create_spk.sh ├── LICENSE └── README.md /1_create_package/nomad/put_nomad_binary_here: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /2_create_project/conf/resource: -------------------------------------------------------------------------------- 1 | {"service-cfg":{}} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.spk 2 | 1_create_package/nomad/nomad 3 | -------------------------------------------------------------------------------- /2_create_project/conf/resource.own: -------------------------------------------------------------------------------- 1 | {"service-cfg":{"jobs":[]}} -------------------------------------------------------------------------------- /1_create_package/ui/nomad-120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/numkem/nomad-spk/HEAD/1_create_package/ui/nomad-120.png -------------------------------------------------------------------------------- /1_create_package/ui/nomad-16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/numkem/nomad-spk/HEAD/1_create_package/ui/nomad-16.png -------------------------------------------------------------------------------- /1_create_package/ui/nomad-192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/numkem/nomad-spk/HEAD/1_create_package/ui/nomad-192.png -------------------------------------------------------------------------------- /1_create_package/ui/nomad-24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/numkem/nomad-spk/HEAD/1_create_package/ui/nomad-24.png -------------------------------------------------------------------------------- /1_create_package/ui/nomad-256.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/numkem/nomad-spk/HEAD/1_create_package/ui/nomad-256.png -------------------------------------------------------------------------------- /1_create_package/ui/nomad-32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/numkem/nomad-spk/HEAD/1_create_package/ui/nomad-32.png -------------------------------------------------------------------------------- /1_create_package/ui/nomad-48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/numkem/nomad-spk/HEAD/1_create_package/ui/nomad-48.png -------------------------------------------------------------------------------- /1_create_package/ui/nomad-64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/numkem/nomad-spk/HEAD/1_create_package/ui/nomad-64.png -------------------------------------------------------------------------------- /1_create_package/ui/nomad-72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/numkem/nomad-spk/HEAD/1_create_package/ui/nomad-72.png -------------------------------------------------------------------------------- /1_create_package/ui/nomad-90.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/numkem/nomad-spk/HEAD/1_create_package/ui/nomad-90.png -------------------------------------------------------------------------------- /2_create_project/PACKAGE_ICON.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/numkem/nomad-spk/HEAD/2_create_project/PACKAGE_ICON.PNG -------------------------------------------------------------------------------- /2_create_project/scripts/postinst: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . `dirname $0`/installer 3 | `basename $0` > $SYNOPKG_TEMP_LOGFILE 4 | -------------------------------------------------------------------------------- /2_create_project/scripts/preinst: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . `dirname $0`/installer 3 | `basename $0` > $SYNOPKG_TEMP_LOGFILE 4 | -------------------------------------------------------------------------------- /2_create_project/scripts/postuninst: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . `dirname $0`/installer 3 | `basename $0` > $SYNOPKG_TEMP_LOGFILE 4 | -------------------------------------------------------------------------------- /2_create_project/scripts/postupgrade: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . `dirname $0`/installer 3 | `basename $0` > $SYNOPKG_TEMP_LOGFILE 4 | -------------------------------------------------------------------------------- /2_create_project/scripts/preuninst: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . `dirname $0`/installer 3 | `basename $0` > $SYNOPKG_TEMP_LOGFILE 4 | -------------------------------------------------------------------------------- /2_create_project/scripts/preupgrade: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . `dirname $0`/installer 3 | `basename $0` > $SYNOPKG_TEMP_LOGFILE 4 | -------------------------------------------------------------------------------- /2_create_project/PACKAGE_ICON_120.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/numkem/nomad-spk/HEAD/2_create_project/PACKAGE_ICON_120.PNG -------------------------------------------------------------------------------- /2_create_project/PACKAGE_ICON_256.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/numkem/nomad-spk/HEAD/2_create_project/PACKAGE_ICON_256.PNG -------------------------------------------------------------------------------- /2_create_project/scripts/nomad.sc: -------------------------------------------------------------------------------- 1 | [nomad] 2 | title="nomad" 3 | desc="nomad" 4 | port_forward="yes" 5 | dst.ports="4646/tcp 4647/tcp 4648/tcp" 6 | 7 | -------------------------------------------------------------------------------- /create_spk.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | cd 1_create_package 4 | tar cvfz package.tgz * 5 | mv package.tgz ../2_create_project/ 6 | cd ../2_create_project/ 7 | tar cvfz nomad.spk * 8 | mv nomad.spk .. 9 | rm -f package.tgz 10 | -------------------------------------------------------------------------------- /1_create_package/ui/config: -------------------------------------------------------------------------------- 1 | { 2 | ".url": { 3 | "com.hashicorp.nomad": { 4 | "type": "url", 5 | "allUsers": true, 6 | "title": "nomad", 7 | "desc": "Easily Deploy Applications at Any Scale", 8 | "icon": "nomad-{0}.png", 9 | "protocol": "http", 10 | "url": "/", 11 | "port": "4646", 12 | "grantPrivilege": "local" 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Alexandre Espinosa Menor 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # nomad-spk 2 | 3 | This package is heavily based from the work done for [gogs-spk](https://github.com/alexandregz/gogs-spk) 4 | 5 | [nomad](https://nomad.io) (Service mesh) SPK package ([Synology PacKages](https://www.synology.com/en-us/dsm/app_packages)) 6 | 7 | Install nomad into a Synology NAS. 8 | 9 | ## Requirements 10 | 11 | Only tested on x64 (DS916+) could work on ARM since a nomad binary exists. 12 | 13 | ## Usage 14 | 15 | Change **Package Center -> Trust Level** to **Any Publisher** and import manually the package from **Manual install**. 16 | Finally, install with nomad web installation. 17 | 18 | ## Configuration 19 | 20 | You can store your configuration using a `conf.d` folder inside `1_create_package/nomad/`. If you don't want to ship your configurations with the package, you can use `/etc/nomad`. 21 | 22 | ## To use with another arch 23 | 24 | Download the binary from https://www.nomadproject.io/downloads.html, replace the content from **1_create_package/nomad** directory and exec create_spk.sh: 25 | 26 | ```~/src/nomad-spk(master)$ rm -rf 1_create_package/nomad/ && unzip nomad_1.4.4_linux_amd64.zip && mv nomad ./1_create_package/``` 27 | 28 | ```$ sh create_spk.sh``` 29 | 30 | -------------------------------------------------------------------------------- /2_create_project/scripts/installer: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # Package 4 | PACKAGE="nomad" 5 | DNAME="nomad" 6 | 7 | INSTALL_DIR="/usr/local/${PACKAGE}" 8 | SSS="/var/packages/${DNAME}/scripts/start-stop-status" 9 | PATH="${INSTALL_DIR}:${PATH}" 10 | 11 | SERVICETOOL="/usr/syno/bin/servicetool" 12 | FWPORTS="/var/packages/${DNAME}/scripts/${PACKAGE}.sc" 13 | 14 | FILE_CREATE_LOG="${INSTALL_DIR}/nomad/wizard_create_log" 15 | LOG_FILE="/var/log/nomad.log" 16 | 17 | CONF_DIR="${INSTALL_DIR}/nomad/conf.d" 18 | 19 | BACKUP_DIR="/tmp/nomad_backup" 20 | 21 | LABEL_DIR="${CONF_DIR}/label" 22 | LICENSE_DIR="${CONF_DIR}/license" 23 | GITIGNORE_DIR="${CONF_DIR}/gitignore" 24 | README_DIR="${CONF_DIR}/readme" 25 | 26 | preinst () 27 | { 28 | cp -r "${CONF_DIR}" "${BACKUP_DIR}" 29 | exit 0 30 | } 31 | 32 | postinst () 33 | { 34 | # Link 35 | ln -s ${SYNOPKG_PKGDEST} ${INSTALL_DIR} 36 | ln -s "${INSTALL_DIR}/${PACKAGE}/${DNAME}" "/usr/local/bin/${DNAME}" 37 | 38 | # to create log at each start 39 | if [ "${wizard_create_log}" == "true" ]; then 40 | touch ${FILE_CREATE_LOG} 41 | fi 42 | 43 | # Add firewall config 44 | ${SERVICETOOL} --install-configure-file --package ${FWPORTS} >> /dev/null 45 | 46 | mkdir -p "${CONF_DIR}" 47 | 48 | exit 0 49 | } 50 | 51 | preuninst () 52 | { 53 | # Stop the package 54 | ${SSS} stop > /dev/null 55 | 56 | # Remove firewall config 57 | if [ "${SYNOPKG_PKG_STATUS}" == "UNINSTALL" ]; then 58 | ${SERVICETOOL} --remove-configure-file --package ${PACKAGE}.sc >> /dev/null 59 | fi 60 | 61 | exit 0 62 | } 63 | 64 | postuninst () 65 | { 66 | # Remove link 67 | rm -f ${INSTALL_DIR} 68 | rm -f "/usr/local/bin/${DNAME}" 69 | 70 | # remove log file 71 | rm -f ${LOG_FILE} 72 | 73 | rm -R "${BACKUP_DIR}" 74 | exit 0 75 | } 76 | 77 | preupgrade () 78 | { 79 | # Stop the package 80 | ${SSS} stop > /dev/null 81 | 82 | if [[ ! -d "${BACKUP_DIR}" ]]; then 83 | mkdir "${BACKUP_DIR}" 84 | fi 85 | 86 | #Label 87 | if [[ -d "${LABEL_DIR}" ]]; then 88 | cp -R "${LABEL_DIR}" "${BACKUP_DIR}" 89 | fi 90 | 91 | exit 0 92 | } 93 | 94 | postupgrade () 95 | { 96 | exit 0 97 | } 98 | -------------------------------------------------------------------------------- /2_create_project/scripts/start-stop-status: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # 3 | 4 | # Package 5 | PACKAGE="nomad" 6 | DNAME="nomad" 7 | 8 | # Others 9 | INSTALL_DIR="/usr/local/${PACKAGE}" 10 | DIR_NOMAD="${INSTALL_DIR}/nomad" 11 | CONF_DIR="${DIR_NAME}/conf.d" 12 | ALT_CONF_DIR="/etc/nomad" 13 | NOMAD="${DIR_NOMAD}/nomad" 14 | PID_FILE="/var/run/nomad.pid" 15 | LOG_FILE="/var/log/nomad.log" 16 | 17 | # If configurations are found in $ALT_CONF_DIR, use it 18 | if [ -d "${ALT_CONF_DIR}" ]; 19 | then 20 | CONF_DIR="${ALT_CONF_DIR}" 21 | fi 22 | ARGS="agent -config=${CONF_DIR}" 23 | 24 | export HOME=${DIR_NOMAD} 25 | export USER=root 26 | export USERNAME=root 27 | 28 | 29 | start_daemon () 30 | { 31 | echo "Using configuration file in ${CONFIG_DIR}" >> $LOG_FILE 32 | ${NOMAD} $ARGS >> ${LOG_FILE} 2>&1 & 33 | echo $! > ${PID_FILE} 34 | } 35 | 36 | stop_daemon () 37 | { 38 | kill `cat ${PID_FILE}` 39 | wait_for_status 1 20 || kill -9 `cat ${PID_FILE}` 40 | rm -f ${PID_FILE} 41 | } 42 | 43 | daemon_status () 44 | { 45 | if [ -f ${PID_FILE} ] && kill -0 `cat ${PID_FILE}` > /dev/null 2>&1; then 46 | return 47 | fi 48 | rm -f ${PID_FILE} 49 | return 1 50 | } 51 | 52 | wait_for_status () 53 | { 54 | counter=$2 55 | while [ ${counter} -gt 0 ]; do 56 | daemon_status 57 | [ $? -eq $1 ] && return 58 | let counter=counter-1 59 | sleep 1 60 | done 61 | return 1 62 | } 63 | 64 | 65 | case $1 in 66 | start) 67 | if daemon_status; then 68 | echo ${DNAME} is already running 69 | else 70 | echo Starting ${DNAME} ... 71 | start_daemon 72 | fi 73 | ;; 74 | stop) 75 | if daemon_status; then 76 | echo Stopping ${DNAME} ... 77 | stop_daemon 78 | else 79 | echo ${DNAME} is not running 80 | fi 81 | ;; 82 | restart) 83 | stop_daemon 84 | start_daemon 85 | ;; 86 | status) 87 | if daemon_status; then 88 | echo ${DNAME} is running 89 | exit 0 90 | else 91 | echo ${DNAME} is not running 92 | exit 1 93 | fi 94 | ;; 95 | log) 96 | echo ${LOG_FILE} 97 | ;; 98 | *) 99 | exit 1 100 | ;; 101 | esac 102 | -------------------------------------------------------------------------------- /2_create_project/INFO: -------------------------------------------------------------------------------- 1 | package="nomad" 2 | version="0.12.4" 3 | description="Easily Deploy Applications at Any Scale" 4 | support_url="https://github.com/hashicorp/nomad/" 5 | displayname="nomad" 6 | maintainer="hashicorp" 7 | maintainer_url="https://www.nomadproject.io" 8 | distributor="Sebastien Bariteau" 9 | distributor_url="https://github.com/numkem/nomad-spk" 10 | arch="noarch" 11 | adminport=4646 12 | adminurl="ui" 13 | dsmuidir="ui" 14 | checkport="yes" 15 | dsmappname="com.hashicorp.nomad" 16 | support_center="yes" 17 | install_dep_services="" 18 | start_dep_services="" 19 | support_conf_folder="yes" 20 | package_icon="iVBORw0KGgoAAAANSUhEUgAAAEgAAABICAYAAABV7bNHAAAAAXNSR0IArs4c6QAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAAsTAAALEwEAmpwYAAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgpMwidZAAAaZklEQVR4Ad1cCXBd1Xn+7/pW6WmXJUtY8m55ASPAGHDwFkoWGuzEZC9J2qFM6LTTTppMM51EdCbTdjKtk9KmgYQ2QJNQO50QIAkNBhwCAWwEAeIF8CLJsiVZ69uXu/X7z333+cl+kt+TTWJ67Pvuueee5f+/8///+c9yJdFFDg6RRDt2yNLu3RZXbW3f/LeyJN2NqIwLr/H+dx9M0jWVDONO6UdP3evc0a1J9/Ua5ZChlpOp3DxOD4PQQ1JPj+Xs2BgmS9lJivQnZDMuvzdwyiW/ZL6LBpCzY4ci9bDU9BDAWUy2/G3S1S1kmO9acJhwFvsLDs7GjaqnUs5H3rvFseWfk6YxODYq5+v3oVYXzBdXcMEACX3eu1eIifXhrXeQY/9EUtXFAMeEUjEwF9zGReF0jpXMWcWEMd64UZHu22sc37jR39Gg3A04vijwMC0GTMHzu1ZyPDznBJDT0yOkAsbYdHZsvcyxnW+Sot5KFkyQYzM4c6rXI+pSulfMiLA3AIaZMLZtWQ9wvi1p6hrKmaxQbG8qrvNSAuRsWiqyD8X2xty+9ROqTI8IcNjeuEE5u4F3+3PZABU5V5K1fcvfKZLzIKlKE4wxO1zq/wd7U6ozz6sOxcbY2bal3pade2RF+Tg5eGNaDI5WquI5p0l5u871XwJhVgli549plDCM5z68da0j0WOypn1cGGNbGOMLB4cBkXEpIEUv6i+Oc5oHmAcWp2kgy7u47DsYiiia3kre+RO2xdy+5SMyOTslXW2DSok5FnLPWHZ6TSWemCcJjDKzFux6DoKYyhFNpoiqQ26BZJaoHvEA+kAFIJ5ExdLIl3TzMDgNVciju/WUaOpCk85hsqBSeefP2L7ly7Lk9MD50zBSMWAX5t8wUywVCTA6GiXyA4C6GnK6FpCzoI6c9ka8x/8jAyQdPkHSSYDBoNQEAKRF9pJWsm66UkiQlMqS8upRksZjRLVhqDzARtmLGaYBBHBkzMQlTBvM1Ac3z9d1ukdR5G2iQbY30gXaG5YYFsCRSaIVHWTftI6c1kZcteRUByEx80kK1oMKgHZDiuzRE0T9b5E0MErK6/1kdDZQ9sYryI5AshhkSJ9yzXIKPPoCyQf7iTidJfIihgJAPa4lsGn3bhr9wA3dmi49pOjqCmYIvo4JeuZub5gZvmJQIaiT/bGtZN9wOTl1EXKgPZLmJ7lqKcn+ZmSDuqAnnGpoVfNKkhatJXPiANnXTVJOlcgMQICtvAGXZTI75lF6+wYKjUZtIZXF6ngGKFuoqCNVbPkFQAwOLgF9/NZNtwVk6d8ATkN+sumAtwKQZ9o8T4xJEeqEO0sNq8nSNrI+eD3ZqxYR+dhuWIBCJqVqDcmBpmkVAk6888O+LCCtKUCW/hqpOdipdIpMM4t3nAMBdZjz6x3zysWS+sgLErXUuu25b71fWXQQlhi8hHLvKvjgvrUxYukZc+yrPln6G9gbSUw2XXsD+1xudUX5lDwDSTAFMNI3rqT09aspvGIZSWxwczBndpbkyKoicNyG+LUEqt5+6y3as+dpWr6ii65bWU+KPUiSD6rIkpPLiDxirQn51boqNIj/WBcTd27erY6nP6pIz5oVa4HKq39QK+tY4tTnF4aCX44ZBllGFvMGAkpn2vDifPcCt1+cLhiD1DgsOTm8TVmkXFZHNsCJL2gkE/2nxWIUCIchrjZJaoDk0Hy3OhcVaAJmLABnamqKPvmpT9H+/fvprr/4AtVXvZ9Wt/nJNnKk61BJtGwYGZ7eSCGfJmV8+gP+Z4+9Tp+uC5Illlk8MsGEZFMqFcLI+ZxIbL0FIt175v0sMZVGR5nH+f3JzMYqTaOJnJFDAhuCyoMYthkYMG/Dpl97GcnrlpNdEyTJSIhRJjamkC8UBl/gTQngyncqy3FRsG2b0mmoJcLI0CmyHA2AKuTk0gBQJVX3gV/YFJjHRCy5t+ZjX/ms9PGvOvTQE0W1nBsFdRIm2WVbcvXuvj6Mj/SBWM6YZ2BpFJoByZlO7LnNlEgRUgO1ATjU4idl81rS1lxBSqQZva2BjyzlkiOUip6k5GSEqurrIS2wnaiquDWWHpaiuro62rVrFz3yyI+pa+VqXKvIiu4HdwUz4qiaT7ItGG3J+VeUcw4c2KWvXHkby25xlQVikQhft6B4hfTZIuq4muEurOYqPbMxW4GS7xicDJw9CwZ3wyJSru2iqrU3UbBhMWl+VC2j522LjHSUEsNvUuLkPqFmig4BMJKwKxBYgIWMonoGicOKFSto+bKlojzlxjEAIq/Mwg0IIIAo7ShwzwJh5au5E4+d0Ntv2ec806PSph52Zt1KuCIXFDGEIZH7pOyg6rLMBbjCykrmm+AukWBwpZoqUjavImn5fKpdfQuFG5fmc7g3BkkP1VHdovXkC9dTcujXFGmAY5jogxGvJRvgsPEuaJrAAM8ox5QZU/CHCi+R5LIvWbZl6/U1q42J6DeQep20yV2KEYXwUxQqAsYr58lrMdreu9nvYIaDjFHDnoJd2LyGnJXNFGq/ugAOqxA6WagM5z1+7Bg9s3cvZX3NGNoXUyaVJCs9CNV5G2oInlm9wDlfjBSrE6+/mZMHycmeRhoL+3Q+ORfAsWVZXm8MPL6B24GKenzx4wWFyv0bbo7BwWSSGTAn4jTa0UAti+fBgbOpal6XIIjBEQwKqZBobGyMNm3eTP39/fTAf/2Qbr3pOkoNHKZQdS1J6bfJyMVJi1wGQ8xzMaiklYP6JchODJCTOglJAqmOEHRRv9sIfl2DaSkBv2xkkrcj5Vd0391+Z8dKGESXljMFzhMbHbV5Yl6cq3KAGByWmskEKVNJGnpjhMydnyLVB0qVCCl+ZpAF4NxOXLRokQDIyGZgm6oobSsYoYbp6OAkHTiwm1avWkNXX7UWMqJgHuuQlY3C00Z7QbdO0TGerCM5r2YATlJspivo3+Y4g1+SpLZxQQQdcG8V/KIWVmSuXYTKAEIxh115TA6VlnoK3/4+aquPkBTR4Z+kSWZmClVzhBXAHZUaGhro/vvvp4MHD9BVV6+jQChIxyem6Ls/fJx2PvC0IOaPt3VTwJqA72dT24KFVNsEqYSjKZkAyqV3pl/JlsjSAv4688Vf3Im899JdH62j4fFp0oB5muQin79Pq01Sopn0mPTT5yZRvgBSASCvY6aVOfsBfo6UzJCM+U/DndvIv2g+NcJ3Gu3vo8RUlpzMpBipFD0g7I5nVL17R0cH8cXBjA/R6eHBAjif+dA1dMPaJdR3fJjSyQQl4ibdcHM7yU+/TM7zr2O2jskZbwrMFByYMXSeEk9+iW7deDsNj50rwmKYBvve/UxdsAdOKODTn0LSH5WUoPP0kOhBGcN5BmrV8JcfpdCKTqhAjsxMjgzchb0BA7ETr5I/8j73Gc4eqwGbCZhqGFwbUgb1hDpEB35DYUw8v/HF7WJZqKWxBt5SknKpPtLgCGazjXSkf5ja3xygwK7nida0Y5dgukCc4Q8x7gUTIlJbVUV11VXEbVcSuPNT2Vt68vNST4oKEnS+ukT7WYPeCuk0b3E7PFoDNtMFgL1e1i1ZDWL4/g1NhRuppqMbhvVMJzJIEohgJzDat5+ip16lZMqgJZiKMHyZxDD5G1dRe8d2amieRxNDB+k//2cP3TUSpbabscSBumS2M7MFMWqglzLsd+Bf+QF+BCksWH/2wc0tPY8/fdIrWhZATBZPzE6lMvQSpGUTTymYWJYOdJyiqmTC8IqxGqPN5JE9ZCTHKdzSRVqwBsCoANOEdExRYugApYZe4xophalEMgnbRTlavO4ztKDrKgpGGkn3hSiNFYDDx78HQaiBavHSd7lB4gU9dp4qDY6sKjWKnduMgg8RNkUJI1pZAHFLjMdp9PSh/Qdo4vQERZZ1kAHAFOz96P4AJCCed/QwRCN/fPAlSo0eIhULYLKCSaaZITM9DrWMiUmqAtDa5rfS8KkBal52M616zzZM0hXKJLGYBoAkfws0BS5AAr1gcU8wFe9oMCFDsKhym2hlaVyivW6fl92qDWlhM/nz3U9RMhonf9BHmq7Bl6mCOnkcuN6vrGHGjpEtO9VH6bFDlI32uSOdhrzoZPaTqlFuYWcnNUR8ABBr0AhcjZMDSEaMDFZh5BOSKt6+oz8yL51AN64QrdzXKwxeQYI89mYjoRF2YAEk52f/8t+wNwpt+INrMV3ANEFsjZ2xN0LcUBEvZ7j1skzlWyhy9thoa1jfyU4cocn+XqpbuF6MbqpzkqwprP3IPpTDelJR8dnou5B30BBZYlsq0fX3duOAVW+vgWYxXOQD0zBTYNZ45Gnx+2g95lxZGOkf//MP6KnvPk4aljN0v05fvPMDFA7qGIkhQR7aDneC98C1n8upJdaQFUqe7KXc5ABs1xg1t8P/gdUU/cm6/TsIgma0pUpSzcYWnZc3haEuAFTMRil6mEwN8r82UkURqNVx+CWTwxN0+Ml9tB/v0p/eSlUh7nEe0bzavDuSRDj7GTk5ifsJhjg7dRwdIcOniotRGvOrmYq56RfxF/xhwYRsTVFCEUfdgKof3gtDXQDofP3EfHAeP0awFeEgdQb95DTV0ZtYZ849tZ8G4bPMm4ftG6hQQYLKZoDJUzDxhXFGL7LBT8QMUjE6sltQQvDKrrncjKLrJBCvqrKuKlg0J6qKx0tMmM5TI8sHhwB6txq0z8PIg1ViGjw5hl84H+cKCWcvIzAQqJ0vIJKORaGuUFFX9gVGZVRyYVlYp2GHoGaXc0Xdvb28SuyGcvnyJInZMNG76HNaAK/6xYefoxP9I1gv1tAGmL2AwL6VDXDSKSy5FiHOtZZ7Vdp8nmI0DBvqONcSG2o0VwCoEpY8MLlMECrXXh2m6PAw/Wz3s5TCljGk1FWNSqnM5xe0AJgsnE8dK5EsmUwotzvrhYJi0Y3r8YgsLlAqPZ+Wz46bQ1hErD/Y7GvlVwUb5NXHieUEzs+MaFC1roCf+q5YSvsefY6WrO6kTdgadkencmqaOY8GcPrAqePzYbDn0VHQX7qAIAhWFm8jmGkEDGxTF0lf6ULnpEpYFrAx5QjqtrIeb/sLAIleOyf/7AlMkxj+Az66xgjS6JJ2+snXHqIFC1toEfbQs5i78QS30sAlLN5ASOfo606OQjU6JAJAiTmfQOKsKpEGdfcp8MRBy2exVrUEZbOQ7opbxzJUra7KwGkJN1IA6KwWy35kYFn8l2J9Z6jWpKdohB57cA997q8/QqGQH5LEo1olZLIZcChSFaD3XrdSeNMa/K9II7smLhCliGOXYCqaoF8eOi7AqhwZt1aQKhtoH8MNTkgUAVQJC8UEcjkW6yA86ysx/A+v7aR9v3yFfnXlYrr5D9efUYsyG2As2cjX14TpRhxMEHqMn/r57RSsqobxhk0SgJ+RefCDRU6F+gZGaP+b/fk5oTuiiq2MYoLPH5dzkFSQ0X1gx0p9Tkb67DaYdx7RGrF9cw0kqXM5piM7d9GbhwZwnhy+jMvl2cVmfWapg9MmyuOECWViU0Jdee6n4fAU11t8qXhWAZLrJKBqgMbAzSVYXBDs6IlIewGguVRUqsxiANQNb9uPdatHv/NzmhjHYrymsr9XMbkWepJV1MHeUjIeo/gkL8c6OLzA6SUuYaNKUVV+GoiU0IYdUGV4wsr6AkAsBXzNNXBZ7j0dvX0FVG31kvl0/NXD9MwT+2FcHV47wwgsesbtWobrPBeUxP2HymX4tIkJAIQzXAoMv0evuOOH78wMXxznH6GJHK8giLLYn/FDerFluJj1TaRh1LC9YzfnoVvwxb4gX8V5mQ4Wz1qowVWQpAVdnfTTex+ll185avJKC1PMnpcDtPiAQ9kXykkg2MhlKT6FpRDEuQ5w4F6MRL6+LKLcUUxYoT/cx2m0FtN9dhzZ5QwkFwK5Ts7vrFJQU31wsZlpzn/eYGBKwDvrLuLTs3MFHaEAXVsdtltam+g/vrbrxMhE/E2fDyBBkKbnLu+JC7EYJgFQLoNVSAbEKyqIKEWJl6GyO4CV09BhNHGzOpVKMOBqFkdGGrEZWKvJSg7ShOZYWmcMbAvwodyM7/lVs1YnbW6sJTOarKv6yYvpcEcz7AcfVpu53IwV8gsU43VwrfoIKYEgyWxzuCHQwuC1YJj/ylSCqpEWwMFOIUmzVljyJe+mWwFNVSezxgGpmagpK9Pn23Rt3jev6uq6obHuBsynsHSI1tk68r9CV7lEimcmjCPF77z28q/yRgCLLPBNsV2Ek6wuqqXKeGXPd+d2M1h95EU6AQ4KcHus71jhpAgOq6DrRRq3w++84D177fO76XF21zGjV9REOvvbsELv4yx1DTi6OWbTMsStnSsXLflkx/yNjWF/BNsosK9cxnX1vPq5veI4P5cKXtsAGnuffJinNN2lys6aJjqnRA7QCoLFi2JcSuQUSR59AiemERMNgKOciCWP3vP24G1fP9L/Cq/+Z1IODXYHdN+UaTU/Pjo5eSIe77s8Eq6pD/hr89iwtE4jqxwCOI+4UAlod61P0V2gzFRWfOULcKXTrnx7qLKc4NEHbACOLMDpjyYPfHL/G7c/fPL0y3xW3NseSQyZ1pEuv5rDunPL09Gkc8/RwSMb6qvltoCvFQ4Y1mtRCzjJA1ZO+9PylAPotAK/uwecvIG5VWXlaDTx6sInfv2ZgXT2Zf7kS/re93A8yw1MvzFi2n26Yo936moj4lUPDgz3dfh84wtDgTa/DweDATT6jA34Jcxv+cgKXlgvFFl+ezL24pL/feGzKP26AKenh8V02gYbM+3ELDoNcPrX+LUgZs9NPxweH49lsgPLq4L1dX5fNTIJkJB3mspxZe+mUOhozGMOTUWfXf6Llz4H+g8XgSMAYlCKgwApnxBa5lM34BTK9YdyJq+q6i9u6r6uuzZyJc95eJRz7dq7D6e85GAvW6I3JmNPrnnypT8Ff8fPBodx8FSM48WBgcqNW/YxXbYnO31qE6Qq9N2+oaPLQ/5ke8Df4teFyrF9FafwigtfyvECOOjXVyaiP127Z98doLc/D845rtNMADGPQpriNg0DnMEuvxbWbGp64OTokGWYg11VocZqvy5Ob6PWd4VdKoAD5vaNRX989TP770T05EzgMAizAcTvPRWMjpr20VrM3pYEtNYfnZ5KP3Hq9LF1tZHgPL/ehF1WOJPYMsEgJ/5xyUssABwLI7A4OPDrsamH1//y5btA4shs4DAL5wPIY5OBykYd5+gpw4pdHdJbXkvl9O/0nTq6NhJOtft9+DKIZ6PsEs7dFfAau9h3AY6MY3pwIp8dm3rwPc/2/jnaGN+FDwZXfetb56hVcfvlAsRlGCSu7CRAOnVFUIukDLvhwcHTJyOKdLojEGiCyoWRCe7opaNyLjiywn8E4unRyfu3/uqVvwIPkwzObfk/wILnGUMlAHElnspNDhv2sfm6onRo2vyHhsZj+0Yn+tbVVQea/L5GOF5i0YnzewVmpOAdfOGBk8Ea0p6RyX9///O/+QKai5ULDpNWKUBchnnmKz1pOUeHTSt5fdjf+nw8JX/r2Mlj19ZWWa0+vRUqpwAlnsoxSr8PnCx0lJLEsb1fjIx/80MvvPYl0JysBBzknxNAXM4LvKs3cCJnDq0P++oHc1bk+ydGTjRoyuiSUKA56NeDPAnLo8TSJPDyCl/Mu1c3vFj4+1BxgBPFabgnR8b/cfuLb3wZbWV6MM+/6+DBWW3O2TTNVYLkjXzyAd+x4qMTtbOzc3LfVOz0Gl0J1zhO6w+Gx+Pj6ezwwmCgtjkA7xsLR/mpvFA5/mGRKtw5Xs5VXI7j3uVyJermirD6KI9hSeSxofGdn9j3279/+Y5urI+0+v+ptdXZuGyZ3NfX55Yo4xfVzRj4ndzd3S2Pj48r1dXVSiKRUHVdBy7YXJZlLZvN8sgFS4RPSjCInYqna0Pxye56I3Nl71Qcn/yogZ+tW7V8S3PdIqxVl78fzXCyHMwtSCdSWeOxkYnv3/XK8W9/+qolybcytjxqWemwpvGBJQOHTvG3Ikwzl8uZ4XDYjMViVn19vdXb28vSxRcMgxtKEcGgKCMjI2ooFGIsNPS/AMK7owGsTIlvysQdQ7sPn0f4NaxGZgwjkEgmF7Wkkpf3jkVxAtNU/2HlosZ5eIvFQLZGmDo7Mq/jow5un4WL00ScyXLNVoFIfuSX7Iwy4dhRFprKK768u+ymIc5dYNpOZl/K+O29CfvJTfXViSjG9oRtp/FxZw6OEJ/z4yuHDs6Cbj4diiNs+PwPcXS4mclkjObmZhNgsfngNqcHqI46ODio+LCAzFLCoPCFCrD/SzrfcQEQxwPHz3FIEafh223x8a8eTWeb6lOxlYeT6aZsHB/TiU1KnJURdo9PTAmA8s9gTYAkAOM4B2bcu9hz4J5lonHxOT6+OM6nG8RRNn5OEYX76bLmQxtqQuk4zs+kbCntU62sZUlZ8CEA4nv+EuAgLgAC/UK6ksmk2dHRYe7du5ePj54TOE0CUDIDFQwGWX3UeDyOfTzxeSDW+fm7bSFB3p3BY8D4WQCHDQBlMpeL1JhmPWa6OrpLhSlS0eUAHN86O5KKxRMFmqRACgCKMFPw1c+oFosKiAEwkBjsmUOQbKTwHfuUkoW8OA/tYKfYMWVHwklnKRX0+SZCipYaNE3DkKQMeoClhIEpvmMzB59EslRZllFVVWUgmKlUymxra7MADHcGX6LH+D5bEIAhg+TZI+irDHukBAIBBZUKAKGKCtskvqNHNKg4Fi8VOQtz5UM8jFHF4nO+lqU6SMeBSQWKBlWDcbLF18hQHOBRfFpAnJ8S5h1/9QuZsdOA0Qmn9GRLQhz1WCr+RIatYMfKUU0V3Jp4P2rbVhjSABos2EyTkxkAaIWFzzytSCRiwq7aRXbHk1S+TwulJGhahjIfvHp4dJMgbRJ0WYKoyi3YxThWVydjT12KZLPAAucmqqvxKaUFjGwpnL9zfKa2ILHARHYSCjDlON9jMRGP+nw2PytjY84pXceyqep0RyI2pMKBJDDDQhJwP4f5mdorTv8/ZWNEE72QvokAAAAASUVORK5CYII=" 21 | --------------------------------------------------------------------------------