/*
 SPDX-License-Identifier: GPL-3.0-or-later
 myMPD (c) 2018-2026 Juergen Mang <mail@jcgames.de>
 https://github.com/jcorporation/mympd
*/

/**
 * This file contains central definitions and is included in each source file
 * as first include. Some defines are configured by cmake.
 */

#ifndef MYMPD_COMPILE_TIME_H
#define MYMPD_COMPILE_TIME_H

#include <inttypes.h>
#include <limits.h>
#include <openssl/opensslv.h>

//translation files
#cmakedefine I18N_bg_BG
#cmakedefine I18N_de_DE
#cmakedefine I18N_en_US
#cmakedefine I18N_es_AR
#cmakedefine I18N_es_ES
#cmakedefine I18N_es_VE
#cmakedefine I18N_fi_FI
#cmakedefine I18N_fr_FR
#cmakedefine I18N_it_IT
#cmakedefine I18N_ja_JP
#cmakedefine I18N_ko_KR
#cmakedefine I18N_nl_NL
#cmakedefine I18N_pl_PL
#cmakedefine I18N_ru_RU
#cmakedefine I18N_zh_Hans

//myMPD version from cmake
#define MYMPD_VERSION "${PROJECT_VERSION}"

// Hide deprecated OpenSSL API functions
#define OPENSSL_NO_DEPRECATED

//minimum mpd version
#define MPD_VERSION_MIN_MAJOR 0
#define MPD_VERSION_MIN_MINOR 23
#define MPD_VERSION_MIN_PATCH 5
#define MPD_TOO_OLD_MSG "MPD version too old, myMPD supports only MPD version >= 0.23.5"

//default paths from cmake
#define MYMPD_DOC_ROOT "${MYMPD_DOC_ROOT}"
#define MYMPD_WORK_DIR "${MYMPD_WORK_DIR}"
#define MYMPD_CACHE_DIR "${MYMPD_CACHE_DIR}"
#define MYMPD_LUALIBS_PATH "${MYMPD_LUALIBS_PATH}"

//standard file names and folders
#define FILENAME_ALBUMCACHE "album_cache.mpack"
#define FILENAME_HOME "home_list"
#define FILENAME_LAST_PLAYED "last_played_list.mpack"
#define FILENAME_PRESETS "preset_list"
#define FILENAME_TIMER "timer_list"
#define FILENAME_TRIGGER "trigger_list"
#define FILENAME_WEBRADIODB "webradiodb.mpack"
#define FILENAME_WEBRADIO_FAVORITES "webradio_favorites.mpack"
#define FILENAME_SCRIPTVARS "scriptvars_list"
#define FILENAME_JUKEBOX "jukebox_list.mpack"

#define FILENAME_CUSTOM_CSS "custom.css"
#define FILENAME_CUSTOM_JS "custom.js"

#define DIR_CACHE_COVER "cover"
#define DIR_CACHE_HTTP "http"
#define DIR_CACHE_LYRICS "lyrics"
#define DIR_CACHE_MISC "misc"
#define DIR_CACHE_THUMBS "thumbs"

#define DIR_WORK_CONFIG "config"
#define DIR_WORK_EMPTY "empty"
#define DIR_WORK_PICS "pics"
#define DIR_WORK_PICS_BACKGROUNDS DIR_WORK_PICS"/backgrounds"
#define DIR_WORK_PICS_THUMBS DIR_WORK_PICS"/thumbs"
#define DIR_WORK_PICS_PLAYLISTS DIR_WORK_PICS"/playlists"
#define DIR_WORK_SCRIPTS "scripts"
#define DIR_WORK_SMARTPLS "smartpls"
#define DIR_WORK_SSL "ssl"
#define DIR_WORK_STATE "state"
#define DIR_WORK_STATE_DEFAULT DIR_WORK_STATE"/default"
#define DIR_WORK_TAGS "tags"

#define UNKNOWN_ALBUM "Unknown Album"

//mpd partitions
#define MPD_PARTITION_DEFAULT "default"
#define MPD_PARTITION_ALL "!all!"

//default configuration
#define CFG_MYMPD_HTTP_HOST_IPV4 "0.0.0.0"
#define CFG_MYMPD_HTTP_HOST_IPV6 "[::]"
#define CFG_MYMPD_LOG_TO_SYSLOG false
#define CFG_MYMPD_LOGLEVEL 5

#define CFG_SMARTPLS_TAG 1000       // max. number of tag values for automatic smartpls creation
#define CFG_SMARTPLS_TAG_MAX 10000  // max. number of tag values for automatic smartpls creation

//default partition state settings
#define PARTITION_HIGHLIGHT_COLOR "#28a745"
#define PARTITION_HIGHLIGHT_COLOR_CONTRAST "#f8f9fa"
#define PARTITION_MPD_STREAM_PORT 8000
#define PARTITION_MPD_STREAM_URI ""

//default mpd state settings
#define MYMPD_MPD_TAG_LIST "Album,AlbumArtist,Artist,Disc,Genre,Name,Title,Track,Name,Date,OriginalDate,"\
    "MUSICBRAINZ_ALBUMID,MUSICBRAINZ_ALBUMARTISTID,MUSICBRAINZ_ARTISTID,MUSICBRAINZ_RELEASETRACKID,MUSICBRAINZ_TRACKID"
#define MYMPD_MPD_KEEPALIVE true
#define MYMPD_MPD_TIMEOUT_SEC 30 //seconds
#define MYMPD_MPD_TIMEOUT 30000 //milliseconds
#define MYMPD_MPD_HOST "localhost"
#define MYMPD_MPD_PORT 6600
#define MYMPD_MPD_PASS ""
#define MYMPD_MPD_BINARYLIMIT 524288 // 512 kB
#define MYMPD_MPD_STRINGNORMALIZATION true

//default mympd state settings
#define MYMPD_MUSIC_DIRECTORY "auto"
#define MYMPD_PLAYLIST_DIRECTORY "auto"
#define MYMPD_JUKEBOX_PLAYLIST "Database"
#define MYMPD_JUKEBOX_UNIQ_TAG MPD_TAG_ARTIST
#define MYMPD_JUKEBOX_LAST_PLAYED 24 // hours
#define MYMPD_JUKEBOX_QUEUE_LENGTH 1 // minimum length of MPD queue
#define MYMPD_JUKEBOX_IGNORE_HATED false
#define MYMPD_JUKEBOX_AUTOSTART true
#define MYMPD_JUKEBOX_MIN_SONG_DURATION 0
#define MYMPD_JUKEBOX_MAX_SONG_DURATION 0
#define MYMPD_IMAGE_NAMES_SM "cover-sm,folder-sm"
#define MYMPD_IMAGE_NAMES_MD "cover,folder"
#define MYMPD_IMAGE_NAMES_LG "cover-lg,folder-lg"
#define MYMPD_TAG_LIST_SEARCH "Album,AlbumArtist,Artist,Genre,Title"
#define MYMPD_TAG_LIST_BROWSE "Album,AlbumArtist,Artist,Genre"
#define MYMPD_SMARTPLS_GENERATE_TAG_LIST ""
#define MYMPD_LAST_PLAYED_COUNT 2000
#define MYMPD_SMARTPLS true
#define MYMPD_SMARTPLS_SORT ""
#define MYMPD_SMARTPLS_PREFIX "myMPDsmart"
#define MYMPD_SMARTPLS_MAX_ENTRIES_DEFAULT 200
#define MYMPD_SMARTPLS_INTERVAL 14400 //seconds - 4 hours
#define MYMPD_SMARTPLS_INTERVAL_HOURS 4 //hours
#define MYMPD_BOOKLET_NAME "booklet.pdf"
#define MYMPD_INFO_TXT_NAME "info.txt"
#define MYMPD_AUTO_PLAY false
#define MYMPD_VIEW_HOME "{\"mode\":\"grid\",\"fields\":[\"Name\"]}"
#define MYMPD_VIEW_QUEUE_CURRENT "{\"mode\":\"table\",\"fields\":[\"Pos\",\"Title\",\"Artist\",\"Album\",\"Duration\"]}"
#define MYMPD_VIEW_SEARCH "{\"mode\":\"table\",\"fields\":[\"Title\",\"Artist\",\"Album\",\"Duration\"]}"
#define MYMPD_VIEW_BROWSE_DATABASE_ALBUM_DETAIL_INFO "{\"mode\":\"table\",\"fields\":[\"Album\",\"AlbumArtist\",\"Genre\"]}"
#define MYMPD_VIEW_BROWSE_DATABASE_ALBUM_DETAIL "{\"mode\":\"table\",\"fields\":[\"Track\",\"Title\",\"Duration\"]}"
#define MYMPD_VIEW_BROWSE_DATABASE_ALBUM_LIST "{\"mode\":\"grid\",\"fields\":[\"Album\",\"AlbumArtist\",\"Thumbnail\"]}"
#define MYMPD_VIEW_BROWSE_DATABASE_TAG_LIST "{\"mode\":\"grid\",\"fields\":[\"Value\"]}"
#define MYMPD_VIEW_BROWSE_PLAYLIST_DETAIL "{\"mode\":\"table\",\"fields\":[\"Pos\",\"Title\",\"Artist\",\"Album\",\"Duration\"]}"
#define MYMPD_VIEW_BROWSE_PLAYLIST_LIST "{\"mode\":\"table\",\"fields\":[\"Type\",\"Name\",\"Last-Modified\"]}"
#define MYMPD_VIEW_BROWSE_FILESYSTEM "{\"mode\":\"table\",\"fields\":[\"Pos\",\"Title\",\"Artist\",\"Album\",\"Duration\"]}"
#define MYMPD_VIEW_PLAYBACK "{\"mode\":\"table\",\"fields\":[\"Artist\",\"Album\"]}"
#define MYMPD_VIEW_QUEUE_LAST_PLAYED "{\"mode\":\"table\",\"fields\":[\"Pos\",\"Title\",\"Artist\",\"Album\",\"LastPlayed\"]}"
#define MYMPD_VIEW_QUEUE_JUKEBOX_SONG "{\"mode\":\"table\",\"fields\":[\"Pos\",\"Title\",\"Artist\",\"Album\"]}"
#define MYMPD_VIEW_QUEUE_JUKEBOX_ALBUM "{\"mode\":\"table\",\"fields\":[\"Pos\",\"Album\",\"AlbumArtist\"]}"
#define MYMPD_VIEW_BROWSE_RADIO_WEBRADIODB "{\"mode\":\"table\",\"fields\":[\"Name\",\"Country\",\"Language\",\"Genre\"]}"
#define MYMPD_VIEW_BROWSE_RADIO_FAVORITES "{\"mode\":\"grid\",\"fields\":[\"Name\",\"Genre\",\"Country\"]}"
#define MYMPD_VOLUME_MIN 0 //prct
#define MYMPD_VOLUME_MAX 100 //prct
#define MYMPD_VOLUME_STEP 5 //prct
#define MYMPD_WEBUI_SETTINGS "{}"
#define MYMPD_LYRICS_USLT_EXT "txt"
#define MYMPD_LYRICS_SYLT_EXT "lrc"
#define MYMPD_LYRICS_VORBIS_USLT "LYRICS"
#define MYMPD_LYRICS_VORBIS_SYLT "SYNCEDLYRICS"
#define MYMPD_NAVBAR_ICONS "[{\"ligature\":\"home\",\"title\":\"Home\",\"options\":[\"Home\"]},"\
    "{\"ligature\":\"equalizer\",\"title\":\"Playback\",\"options\":[\"Playback\"]},"\
    "{\"ligature\":\"queue_music\",\"title\":\"Queue\",\"options\":[\"Queue\"]},"\
    "{\"ligature\":\"library_music\",\"title\":\"Browse\",\"options\":[\"Browse\"]},"\
    "{\"ligature\":\"search\",\"title\":\"Search\",\"options\":[\"Search\"]}]"
#define MYMPD_TAG_DISC_EMPTY_IS_FIRST true

//http headers
#define EXTRA_HEADERS_CACHE "Cache-Control: max-age=604800\r\n"

#define EXTRA_HEADERS_MISC "X-Content-Type-Options: nosniff\r\n"\
    "Access-Control-Allow-Origin: *\r\n"

#define EXTRA_HEADERS_PERMISSIONS_POLICY "Permissions-Policy: autoplay=(self), fullscreen=(self), microphone=(self)\r\n"

#define EXTRA_HEADERS_UNSAFE "Content-Security-Policy: default-src 'none'; "\
    "style-src 'self' 'unsafe-inline'; font-src 'self'; script-src 'self' 'unsafe-inline'; img-src * data:; "\
    "connect-src 'self' ws: wss:; manifest-src 'self'; "\
    "media-src *; frame-ancestors *; base-uri 'none';\r\n"\
    EXTRA_HEADERS_PERMISSIONS_POLICY\
    EXTRA_HEADERS_MISC\
    EXTRA_HEADERS_CACHE

#define EXTRA_HEADERS_SAFE "Content-Security-Policy: default-src 'none'; "\
    "style-src 'self'; font-src 'self'; script-src 'self'; img-src 'self' data:; "\
    "connect-src 'self' ws: wss:; manifest-src 'self'; "\
    "media-src *; frame-src *; frame-ancestors *; base-uri 'none'; "\
    "require-trusted-types-for 'script'\r\n"\
    EXTRA_HEADERS_PERMISSIONS_POLICY\
    EXTRA_HEADERS_MISC

#define EXTRA_HEADERS_SAFE_CLOSE \
    EXTRA_HEADERS_SAFE\
    "Connection: close\r\n"

#define EXTRA_HEADERS_SAFE_KEEP_ALIVE \
    EXTRA_HEADERS_SAFE\
    "Connection: keep-alive\r\n"

#define EXTRA_HEADERS_SAFE_CACHE EXTRA_HEADERS_SAFE\
    EXTRA_HEADERS_CACHE

#define EXTRA_HEADERS_IMAGE EXTRA_HEADERS_MISC\
    EXTRA_HEADERS_CACHE

#define EXTRA_HEADERS_CSS EXTRA_HEADERS_MISC\
    EXTRA_HEADERS_CACHE\
    "Content-Type: text/css; charset=utf-8\r\n"

#define EXTRA_HEADERS_JS EXTRA_HEADERS_MISC\
    EXTRA_HEADERS_CACHE\
    "Content-Type: text/javascript; charset=utf-8\r\n"

#define EXTRA_HEADERS_PLACEHOLDER EXTRA_HEADERS_IMAGE "X-myMPD-Placeholder: 1\r\n"

#define EXTRA_HEADER_CONTENT_ENCODING "Content-Encoding: gzip\r\n"
#define EXTRA_HEADERS_JSON_CONTENT "Content-Type: application/json\r\n"\
    EXTRA_HEADERS_SAFE

#define DIRECTORY_LISTING_CSS "h1{top:0;font-size:inherit;font-weight:inherit}address{bottom:0;font-style:normal}"\
    "h1,address{background-color:#343a40;color:#f8f9fa;padding:1rem;position:fixed;"\
    "box-sizing:border-box;width:100%;margin-top:0}body{margin:5rem 0;background-color:#f7f7f7;"\
    "color:#212529;font-family:sans-serif;font-size:1rem;font-weight:400;line-height:1.5}"\
    "table{border-collapse:collapse;margin:1rem}th{border-bottom:2px solid #dee2e6;"\
    "border-top:1px solid #dee2e6;text-align:left;padding:.3rem;font-family:inherit}"\
    "td{text-align:left;padding:.3rem;font-family:inherit;border-bottom:1px solid #dee2e6}"\
    "td:last-child{text-align:right}a,a:visited,a:active{color:#212529;text-decoration:none}"\
    "a:hover{text-decoration:underline}"

#define EXTRA_MIME_TYPES "avif=image/avif,flac=audio/flac,oga=audio/ogg,ogg=audio/ogg,"\
    "opus=audio/ogg,spx=audio/ogg,pem=application/x-x509-ca-cert,woff2=font/woff2,"\
    "m3u=audio/mpegurl,json=application/json,jxl=image/jxl"

//io defaults
#define OPEN_FLAGS_READ "re"
#define OPEN_FLAGS_READ_BIN "rbe"
#define OPEN_FLAGS_WRITE "we"

//log level
#define LOGLEVEL_MIN 0
#define LOGLEVEL_MAX 7

//certificates
#define CA_LIFETIME 3650 //days
#define CA_LIFETIME_MIN 365 //days
#define CA_KEY_LENGTH_RSA 4096 //bytes for RSA
#define CA_KEY_LENGTH_EC 384 //bytes for EC: 256 or 384
#define CERT_LIFETIME 365 //days
#define CERT_LIFETIME_MIN 30 //days
#define CERT_KEY_LENGTH_RSA 2048 // bytes for RSA
#define CERT_KEY_LENGTH_EC 256 // bytes for EC: 256 or 384

#ifdef OPENSSL_VERSION_MAJOR
    #define CA_KEY_TYPE EVP_PKEY_EC //key type: EVP_PKEY_EC or EVP_PKEY_RSA
    #define CA_KEY_LENGTH CA_KEY_LENGTH_EC // Set this according to the key type
    #define CERT_KEY_TYPE EVP_PKEY_EC //key type: EVP_PKEY_EC or EVP_PKEY_RSA
    #define CERT_KEY_LENGTH CERT_KEY_LENGTH_EC // Set this according to the key type
#else
    #define CA_KEY_TYPE EVP_PKEY_RSA
    #define CA_KEY_LENGTH CA_KEY_LENGTH_RSA
    #define CERT_KEY_TYPE EVP_PKEY_RSA
    #define CERT_KEY_LENGTH CERT_KEY_LENGTH_RSA
#endif

#define CFG_MYMPD_CERT_CHECK true

#define CACERT_STORE_SIZE_MAX 1048576
#define CUSTOM_CSS_JS_SIZE_MAX 1048576

//http limits
#define HTTP_CONNECTIONS_MAX 100
#define URI_LENGTH_MAX 2048
#define BODY_SIZE_MAX 16384 //bytes
#define WS_PING_TIMEOUT 300 // seconds

//session limits
#define SHA256_HASH_LEN 64
#define HTTP_SESSION_STR_LEN 20 // Length of session identifier
#define HTTP_SESSIONS_MAX 10
#define HTTP_SESSION_TIMEOUT 1800 //seconds

//content limits
#define NAME_LEN_MAX 200
#define CONTENT_LEN_MAX 102400
#define EXPRESSION_LEN_MAX 1000
#define FIELDS_MAX 64

//mpd limits
#define MPD_OUTPUT_ID_MAX 40
#define MPD_PORT_MIN 1024
#define MPD_PORT_MAX 65535
#define MPD_TIMEOUT_MIN 10000 //ms
#define MPD_TIMEOUT_MAX 1000000 //ms
#define MPD_RESULTS_MIN 1 // minimum mpd results to request
#define MPD_RESULTS_MAX 10000 // maximum mpd results to request
#define MPD_COMMANDS_MAX 10000 // maximum number of commands for mpd command lists
#define MPD_PLIST_LENGTH 16384 // default mpd max playlist length
#define MPD_PLIST_LENGTH_MAX INT_MAX // max mpd playlist length
#define MPD_QUEUE_LENGTH_MAX INT_MAX // max mpd queue length
#define MPD_BINARY_CHUNK_SIZE_MIN 4096 // 4 kB is the mpd default
#define MPD_BINARY_CHUNK_SIZE_MAX 5242880 // 5 MB
#define MPD_BINARY_SIZE_MAX 10485760 // 10 MB
#define MPD_QUEUE_PRIO_MAX 255
#define MPD_CROSSFADE_MAX 100
#define MPD_CONNECTION_MAX 25

//limits for json parsing
#define JSONRPC_INT_MIN INT_MIN
#define JSONRPC_INT_MAX INT_MAX
#define JSONRPC_INT64_MIN INT64_MIN
#define JSONRPC_INT64_MAX INT64_MAX
#define JSONRPC_UINT_MIN 0
#define JSONRPC_UINT_MAX UINT_MAX
#define JSONRPC_STR_MAX 3002  // 3000 bytes for the value + 2 bytes for escapes
#define JSONRPC_KEY_MAX 500
#define JSONRPC_ARRAY_MAX 1000
#define JSONRPC_TIME_MIN 0 // Do 1. Jan 01:00:00 CET 1970
#define JSONRPC_TIME_MAX 253402297169 // Fr 31. Dez 23:59:29 CET 9999

//timer
#define TIMER_WEBRADIODB_UPDATE_OFFSET 20 //seconds
#define TIMER_WEBRADIODB_UPDATE_INTERVAL 86400 //seconds - one day
#define TIMER_DISK_CACHE_CLEANUP_OFFSET 240 //seconds - 4 minutes
#define TIMER_DISK_CACHE_CLEANUP_INTERVAL 86400 //seconds - one day
#define TIMER_SMARTPLS_UPDATE_OFFSET 30 //seconds
#define TIMER_DISK_STATE_SAVE_OFFSET 300 //seconds - 5 minutes
#define TIMER_INTERVAL_MIN 0 //seconds
#define TIMER_INTERVAL_MAX 7257600 //seconds - 12 weeks

//some other limits
#define CACHE_AGE_MIN -1 //days
#define CACHE_AGE_MAX 365 //days
#define VOLUME_MIN 0 //prct
#define VOLUME_MAX 100 //prct
#define VOLUME_STEP_MIN 1 //prct
#define VOLUME_STEP_MAX 25 //prct
#define JUKEBOX_MODE_MIN 0
#define JUKEBOX_MODE_MAX 3
#define JUKEBOX_ADD_SONG_MAX 99
#define JUKEBOX_MIN_SONG_DURATION_MAX INT_MAX
#define JUKEBOX_MAX_SONG_DURATION_MAX INT_MAX
#define JUKEBOX_ADD_SONG_OFFSET 10 // add new song 10 seconds before current song ends
#define SCROBBLE_TIME_MIN 10 //minimum song length in seconds for the scrobble event
#define SCROBBLE_TIME_MAX 240 //maximum elapsed seconds before scrobble event occurs
#define SCROBBLE_TIME_TOTAL 480 //if the song is longer then this value, scrobble at SCROBBLE_TIME_MAX
#define MAX_ENV_LENGTH 100 //maximum length of environment variables
#define MAX_MPD_WORKER_THREADS 10 //maximum number of concurrent worker threads
#define MAX_SCRIPT_WORKER_THREADS 20 //maximum number of concurrent script worker threads
#define MBID_LENGTH 36 //length of a MusicBrainz ID
#define STICKER_LIKE_MIN 0
#define STICKER_LIKE_MAX 2
#define STICKER_RATING_MIN 0
#define STICKER_RATING_MAX 10
#define STICKER_OP_LEN_MAX 20 // max. length of sticker operators
#define SORT_LEN_MAX 100

//limits for lists
#define LIST_HOME_ICONS_MAX 99
#define LIST_SCRIPT_VARS_MAX 99
#define LIST_TRIGGER_MAX 99
#define LIST_TIMER_MAX 99
#define USER_TIMER_ID_START 100
#define USER_TIMER_ID_MIN 101
#define USER_TIMER_ID_MAX 200
#define JUKEBOX_QUEUE_MIN 0
#define JUKEBOX_QUEUE_MAX 999
#define JUKEBOX_LAST_PLAYED_MIN 0
#define JUKEBOX_LAST_PLAYED_MAX 5000
#define JUKEBOX_UNIQ_RANGE 50
#define SCRIPT_ARGUMENTS_MAX 20
#define HOME_WIDGET_REFRESH_MAX 360

// timer + mpd connections + stickerdb + eventfd (mympd api queue)
#define POLL_FDS_MAX LIST_TIMER_MAX + (MPD_CONNECTION_MAX * 4) + 1 + 1

//filesystem limits
#define FILENAME_LEN_MAX 200
#define FILEPATH_LEN_MAX 1000

//file size limits
#define LINE_LENGTH_MAX 8192 // 8 kb
#define LYRICS_SIZE_MAX 10000 //bytes
#define SMARTPLS_SIZE_MAX 2000 //bytes
#define SSL_FILE_MAX 8192 // 8 kb

//limits for stickers
#define STICKER_PLAY_COUNT_MAX INT_MAX / 2
#define STICKER_SKIP_COUNT_MAX INT_MAX / 2

#define PADDING_LENGTH 12

//WebradioDB
#define WEBRADIODB_URI "https://jcorporation.github.io/webradiodb/db/index/webradios.min.json"
#define WEBRADIODB_URI_PICS "https://jcorporation.github.io/webradiodb/db/pics/"

// Script import
#define SCRIPTS_URI_RELEASE "https://github.com/jcorporation/mympd-scripts/tree/main/"
#define SCRIPTS_IMPORT_URI_RELEASE "https://raw.githubusercontent.com/jcorporation/mympd-scripts/main/"

#define SCRIPTS_URI_DEBUG "https://github.com/jcorporation/mympd-scripts/tree/devel/"
#define SCRIPTS_IMPORT_URI_DEBUG "https://raw.githubusercontent.com/jcorporation/mympd-scripts/devel/"

#define SCRIPTS_SIGN_KEY_PUB "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA2iMis8RxMQCR49BFqH/i\nvoc+XBjYySAvG55PDKnp7RlDShSYIe/M27UZNYaOJDUAw7SWvJwDvu+TtK+p+Caq\nwuhIKiWfRib7H3/Sk07pV1h2Q5bVzH2501s8umnpMrhZfsUhV46/QjnT6fA8/ui4\nsxQm57hDnO360OVybz7NM/8FNoclfZvJWzaxmICOcpToUDPD+e4FpuG8Dtw/F7uH\nUomQdW6kDCTAnxXMfIfTuy149x/6b5khheZW7pE3hTSBgR9VXQoRA7WUu8Vr6+0k\ntdEgX49rhteCgX2NssI1ddclI+lFrKGO3qn+90YHdWOCE3urMZ0uuLJMAtK3pQqH\na7JXCt9HRuwqWEJBedXNyJDYm2rBPaax67ItwTCaNShpcM9V75PQcWvurN6+PRSq\nR9/Maapm4Ub+GJCzLCKk1lwvxKYZBP9Zj/jYJMQ/krV0F8OoC42VyEjlheLKu3ij\nuSVcrnW0+9uVj/6naQAUHbXsINjgsk4ZFwBSp6ohPsF7L7CFH3gvi6XCxCchTCWg\nEbdYerCIxlkIqZRmQ8X8fE+YzSo/jyMvK9ptIKdd6GMj0owSpIk71iWQhw6p76tF\n1COeLBNOF+pLlJLghpONtUr/zaLMUoY21EUx1JftTMTLHupsvxDVY8t23jTfAILS\nIIxZ6n/xG1lfUI0ywKWenoMCAwEAAQ==\n-----END PUBLIC KEY-----\n"

#endif
