unrealircd

- supernets unrealircd source & configuration
git clone git://git.acid.vegas/unrealircd.git
Log | Files | Refs | Archive | README | LICENSE

commit 4e71d6feade725e626f1a0e2edd4a8eeafa47f26
parent aa3cc227c571062484313c221f7251f0974ad717
Author: acidvegas <acid.vegas@acid.vegas>
Date: Sat, 15 Jan 2022 00:16:34 -0500

Updated to 6.0.1.1

Diffstat:
ABSDmakefile | 4++++
ACONTRIBUTING.md | 5+++++
MConfig | 223++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------
MMakefile.in | 26++++++++++++++++++--------
MMakefile.windows | 1303++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
MREADME.md | 5+++++
MSECURITY.md | 3++-
Mautoconf/config.guess | 1682+++++++++++++++++++++++++++++++++++++++++++++++--------------------------------
Mautoconf/config.sub | 2640+++++++++++++++++++++++++++++++++++++++++--------------------------------------
Mautoconf/m4/unreal.m4 | 105++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
Mconfigure | 660++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------
Mconfigure.ac | 119+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------
Mdoc/Config.header | 8++++----
Mdoc/RELEASE-NOTES.md | 1206+++++++++++++++----------------------------------------------------------------
Mdoc/conf/badwords.conf | 68++++++++++++++++++++++++++++++++++++++++++++------------------------
Mdoc/conf/except.conf | 50++++++++++++++++++++++++++++----------------------
Mdoc/conf/modules.conf | 98++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------
Adoc/conf/snomasks.conf | 228+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mdoc/conf/tls/curl-ca-bundle.crt | 496++++++++++++++++++++++++++++++++++++++++---------------------------------------
Mdoc/conf/unrealircd.hub.conf | 7++++---
Mdoc/conf/unrealircd.remote.conf | 114++++++++++++++++++++++++++++++++++++++++++++++---------------------------------
Mdoc/translations.txt | 2+-
Mextras/build-tests/nix/build | 18++++++++++++++----
Mextras/build-tests/nix/configs/default | 14++++++++++----
Mextras/build-tests/nix/run-tests | 7++++++-
Mextras/build-tests/windows/build.bat | 54+++++++++++++++++++++++++++++-------------------------
Mextras/build-tests/windows/compilecmd/vs2019.bat | 39++++++++++++++++++++++++---------------
Mextras/c-ares.tar.gz | 0
Mextras/curlinstall | 2+-
Mextras/doxygen/Developers.md | 2+-
Mextras/doxygen/Doxyfile | 2+-
Aextras/geoip-classic.tar.gz | 0
Aextras/jansson.tar.gz | 0
Mextras/security/apparmor/unrealircd | 4++--
Aextras/tests/tls/cipherscan_profiles/openssl-300.txt | 27+++++++++++++++++++++++++++
Mextras/tls.cnf | 2+-
Mextras/unrealircd-upgrade-script.in | 44+++++++++++++++++++++++++++++++-------------
Minclude/channel.h | 2+-
Minclude/common.h | 14+-------------
Minclude/config.h | 47+++++++++++++++++++++++++++++++++--------------
Minclude/dbuf.h | 2+-
Minclude/dynconf.h | 80+++++++++++++++++++++++++++++++++----------------------------------------------
Minclude/fdlist.h | 8+++++---
Minclude/h.h | 850++++++++++++++++++++++++++++++++++++++++++++++---------------------------------
Minclude/ircsprintf.h | 2+-
Minclude/modules.h | 724++++++++++++++++++++++++++++++++++++++++++-------------------------------------
Minclude/msg.h | 1-
Minclude/numeric.h | 298+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------
Dinclude/proto.h | 68--------------------------------------------------------------------
Minclude/setup.h.in | 9+++------
Minclude/struct.h | 694+++++++++++++++++++++++++++++++++++--------------------------------------------
Minclude/sys.h | 3---
Minclude/unrealircd.h | 2--
Dinclude/url.h | 13-------------
Minclude/version.h | 5+++--
Minclude/whowas.h | 2+-
Minclude/windows/setup.h | 8+++-----
Msrc/Makefile.in | 173+++++--------------------------------------------------------------------------
Msrc/aliases.c | 44++++++++++++++++++++++++--------------------
Msrc/api-channelmode.c | 957+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------
Msrc/api-clicap.c | 36+++++++++++++++++++++++-------------
Msrc/api-command.c | 20++++++++++----------
Msrc/api-efunctions.c | 135+++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------
Msrc/api-event.c | 36+++++++++---------------------------
Msrc/api-extban.c | 427+++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------
Msrc/api-history-backend.c | 39+++++++++++++++++++--------------------
Msrc/api-isupport.c | 11++---------
Msrc/api-messagetag.c | 27+++++++++++++++++----------
Msrc/api-moddata.c | 33+++++++++++++++++++++++++--------
Msrc/api-usermode.c | 438++++++++++++++++++++++++++++---------------------------------------------------
Msrc/auth.c | 83++++++++++++++++++++++++++++++++++++++++---------------------------------------
Msrc/buildmod | 3++-
Msrc/channel.c | 692+++++++++++++++++++++++++++++++++++++------------------------------------------
Msrc/conf.c | 6090+++++++++++++++++++++++++++++++++++++------------------------------------------
Msrc/conf_preprocessor.c | 28++++++++++++++--------------
Msrc/crashreport.c | 6+++---
Msrc/crule.c | 7+------
Msrc/dbuf.c | 2+-
Msrc/debug.c | 14++++++++------
Msrc/dispatch.c | 94+++++++++++++++++++++++++++++++++++++++++++++++++------------------------------
Msrc/dns.c | 105+++++++++++++++++++++++++++-----------------------------------------------------
Msrc/fdlist.c | 93+++++++++++++++++++++++++++++++++++++++++++++++--------------------------------
Msrc/hash.c | 358+++++--------------------------------------------------------------------------
Msrc/ircd.c | 382+++++++++++++++++++++++++------------------------------------------------------
Msrc/list.c | 100+++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------
Asrc/log.c | 1871+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/macosx/UnrealIRCd/AppModel.swift | 2+-
Msrc/match.c | 41++++++++++++++++++++++-------------------
Msrc/misc.c | 1079+++++++++++++++++++++++++++++++++++++++++++++++++------------------------------
Msrc/modulemanager.c | 178++++++++++++++++++++++++++++++++++++++++++-------------------------------------
Msrc/modules.c | 187+++++++++++++++++++++++++++++++++++++++++++------------------------------------
Msrc/modules/Makefile.in | 617++++---------------------------------------------------------------------------
Msrc/modules/account-notify.c | 4++--
Msrc/modules/account-tag.c | 14+++++++-------
Msrc/modules/addmotd.c | 4++--
Msrc/modules/addomotd.c | 4++--
Msrc/modules/admin.c | 4++--
Msrc/modules/antimixedutf8.c | 69+++++++++++++++++++++++++++++++++------------------------------------
Msrc/modules/antirandom.c | 171++++++++++++++++++++++---------------------------------------------------------
Msrc/modules/authprompt.c | 87++++++++++++++++++++++++++++++++++++++++---------------------------------------
Msrc/modules/away.c | 71++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------
Msrc/modules/batch.c | 6+++---
Msrc/modules/blacklist.c | 192++++++++++++++++++++++++++++++++++++++++++-------------------------------------
Msrc/modules/bot-tag.c | 10+++++-----
Msrc/modules/botmotd.c | 4++--
Msrc/modules/cap.c | 48+++++++++---------------------------------------
Msrc/modules/certfp.c | 37++++++++++++++++++++-----------------
Msrc/modules/chanmodes/Makefile.in | 92++++++++++---------------------------------------------------------------------
Msrc/modules/chanmodes/censor.c | 112++++++++++++++++++++++++++++++++++++++++----------------------------------------
Asrc/modules/chanmodes/chanadmin.c | 88+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/modules/chanmodes/chanop.c | 78++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/modules/chanmodes/chanowner.c | 88+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/modules/chanmodes/delayjoin.c | 88++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------
Msrc/modules/chanmodes/floodprot.c | 212+++++++++++++++++++++++++++++++++++++------------------------------------------
Asrc/modules/chanmodes/halfop.c | 88+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/modules/chanmodes/history.c | 212++++++++++++++++++++++++++++++++++++++++----------------------------------------
Asrc/modules/chanmodes/inviteonly.c | 77+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/modules/chanmodes/isregistered.c | 72++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/modules/chanmodes/issecure.c | 60++++++++++++++++++++++++++++++------------------------------
Asrc/modules/chanmodes/key.c | 232+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/modules/chanmodes/limit.c | 198+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/modules/chanmodes/link.c | 178+++++++++++++++++++++++++++++++++++++++++++++++--------------------------------
Asrc/modules/chanmodes/moderated.c | 117+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/modules/chanmodes/nocolor.c | 26+++++++++++++-------------
Msrc/modules/chanmodes/noctcp.c | 12++++++------
Asrc/modules/chanmodes/noexternalmsgs.c | 89+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/modules/chanmodes/noinvite.c | 16++++++++--------
Msrc/modules/chanmodes/nokick.c | 10+++++-----
Msrc/modules/chanmodes/noknock.c | 22+++++++++++-----------
Msrc/modules/chanmodes/nonickchange.c | 8++++----
Msrc/modules/chanmodes/nonotice.c | 12++++++------
Msrc/modules/chanmodes/operonly.c | 35+++++++++++++++++++----------------
Msrc/modules/chanmodes/permanent.c | 15+++++++++------
Asrc/modules/chanmodes/private.c | 73+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/modules/chanmodes/regonly.c | 13++++++++-----
Msrc/modules/chanmodes/regonlyspeak.c | 24++++++++++++------------
Asrc/modules/chanmodes/secret.c | 73+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/modules/chanmodes/secureonly.c | 39++++++++++++++++++++-------------------
Msrc/modules/chanmodes/stripcolor.c | 24++++++++++++------------
Asrc/modules/chanmodes/topiclimit.c | 82+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/modules/chanmodes/voice.c | 88+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/modules/channeldb.c | 100++++++++++++++++++++++++++++++++-----------------------------------------------
Msrc/modules/charsys.c | 58+++++++++++++++++++++++++++++++++++++---------------------
Msrc/modules/chathistory.c | 169++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------
Msrc/modules/chghost.c | 209++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
Msrc/modules/chgident.c | 20++++++++------------
Msrc/modules/chgname.c | 18+++++++-----------
Msrc/modules/clienttagdeny.c | 4++--
Dsrc/modules/cloak.c | 425-------------------------------------------------------------------------------
Asrc/modules/cloak_md5.c | 422+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/modules/cloak_none.c | 87+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/modules/cloak_sha256.c | 411+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/modules/close.c | 7++++---
Msrc/modules/connect.c | 25++++---------------------
Msrc/modules/connthrottle.c | 173+++++++++++++++++++++++++++++++++++++++----------------------------------------
Msrc/modules/cycle.c | 10++++++----
Msrc/modules/dccallow.c | 17+++++++++++------
Msrc/modules/dccdeny.c | 163++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
Msrc/modules/echo-message.c | 10+++++-----
Msrc/modules/eos.c | 8++------
Msrc/modules/extbans/Makefile.in | 70+++++++++-------------------------------------------------------------
Msrc/modules/extbans/account.c | 34++++++++++++++++++++++------------
Msrc/modules/extbans/certfp.c | 42+++++++++++++++++++++---------------------
Asrc/modules/extbans/country.c | 124+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/modules/extbans/inchannel.c | 57+++++++++++++++++++++++++++++++--------------------------
Msrc/modules/extbans/join.c | 21++++++++-------------
Msrc/modules/extbans/msgbypass.c | 110++++++++++++++++++++++++++++++++++++++++----------------------------------------
Msrc/modules/extbans/nickchange.c | 23+++++++++--------------
Msrc/modules/extbans/operclass.c | 31++++++++++++++-----------------
Msrc/modules/extbans/partmsg.c | 15+++++++++------
Msrc/modules/extbans/quiet.c | 20++++++++------------
Msrc/modules/extbans/realname.c | 30++++++++++++++++--------------
Msrc/modules/extbans/securitygroup.c | 54++++++++++++++++++++++++------------------------------
Msrc/modules/extbans/textban.c | 111++++++++++++++++++++++++++++++++++---------------------------------------------
Msrc/modules/extbans/timedban.c | 178++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
Asrc/modules/extended-monitor.c | 153+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/modules/extjwt.c | 1151+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/modules/geoip_base.c | 326+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/modules/geoip_classic.c | 297+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/modules/geoip_csv.c | 838+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/modules/geoip_maxmind.c | 239+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/modules/globops.c | 6++----
Msrc/modules/help.c | 12++++++------
Msrc/modules/hideserver.c | 70+++++++++++++++++++++++++++++++++++-----------------------------------
Msrc/modules/history.c | 13++++++++-----
Msrc/modules/history_backend_mem.c | 126+++++++++++++++++++++++++++++++++++++++++++------------------------------------
Msrc/modules/history_backend_null.c | 18+++++++++---------
Msrc/modules/ident_lookup.c | 10+++++-----
Msrc/modules/invite.c | 505+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------
Msrc/modules/ircops.c | 2+-
Msrc/modules/ison.c | 8+++++---
Msrc/modules/join.c | 453+++++++++++++++++++++++--------------------------------------------------------
Msrc/modules/jointhrottle.c | 28+++++++++++++---------------
Asrc/modules/json-log-tag.c | 90+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/modules/jumpserver.c | 103+++++++++++++++++++++++++++++++++++++++++--------------------------------------
Msrc/modules/kick.c | 386+++++++++++++++++++++++++++++++++++++++----------------------------------------
Msrc/modules/kill.c | 36+++++++++++++++---------------------
Msrc/modules/knock.c | 26+++++++++++++-------------
Msrc/modules/labeled-response.c | 14+++++++-------
Msrc/modules/lag.c | 4++--
Msrc/modules/link-security.c | 62+++++++++++++++++++++++++++++++-------------------------------
Msrc/modules/links.c | 4++--
Msrc/modules/list.c | 42++++++++++++++++--------------------------
Msrc/modules/locops.c | 6++----
Msrc/modules/lusers.c | 16+++++++++-------
Msrc/modules/map.c | 12++++++------
Msrc/modules/md.c | 159+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------
Dsrc/modules/mdex.c | 317-------------------------------------------------------------------------------
Msrc/modules/message-ids.c | 14++++++--------
Msrc/modules/message-tags.c | 20+++++++++++++-------
Msrc/modules/message.c | 267+++++++++++++++++++++++++++----------------------------------------------------
Msrc/modules/mkpasswd.c | 12++++++------
Msrc/modules/mode.c | 1760++++++++++++++++++++++++++++++-------------------------------------------------
Asrc/modules/monitor.c | 232+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/modules/motd.c | 8++++----
Msrc/modules/names.c | 63++++++++++++++++++++++++++-------------------------------------
Msrc/modules/netinfo.c | 66+++++++++++++++++++++++++++++++++---------------------------------
Msrc/modules/nick.c | 1260+++++++++++++++++++++++++++++++++++--------------------------------------------
Msrc/modules/nocodes.c | 8++++----
Msrc/modules/oper.c | 149++++++++++++++++++++++++++++++++++++++-----------------------------------------
Asrc/modules/operinfo.c | 99+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/modules/opermotd.c | 2+-
Msrc/modules/part.c | 48++++++++++++++++++++++--------------------------
Msrc/modules/pass.c | 6+++---
Msrc/modules/pingpong.c | 8++++----
Msrc/modules/plaintext-policy.c | 4++--
Msrc/modules/protoctl.c | 174++++++++++++++++++++++++++++++++++++-------------------------------------------
Msrc/modules/quit.c | 46++++++++++++++++++++++++++++++----------------
Msrc/modules/reply-tag.c | 12++++++------
Msrc/modules/reputation.c | 166+++++++++++++++++++++++++++++++++++++++++++++----------------------------------
Msrc/modules/require-module.c | 120+++++++++++++++++++++++++++++++++++++++++++++----------------------------------
Msrc/modules/restrict-commands.c | 100++++++++++++++++++++++++++++++++++++++++----------------------------------------
Msrc/modules/rmtkl.c | 26++++++++++++++------------
Msrc/modules/rules.c | 6+++---
Msrc/modules/sajoin.c | 142+++++++++++++++++++++++++++++++++++++++++--------------------------------------
Msrc/modules/samode.c | 4++--
Msrc/modules/sapart.c | 74++++++++++++++++++++++++++++++++++++++++++++++++--------------------------
Msrc/modules/sasl.c | 53+++++++++++++++++++++++++----------------------------
Msrc/modules/sdesc.c | 10+++++-----
Msrc/modules/sendsno.c | 28+++++++++++++---------------
Msrc/modules/sendumode.c | 20++++----------------
Msrc/modules/server-time.c | 10+++++-----
Msrc/modules/server.c | 1522+++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------
Msrc/modules/sethost.c | 6+++---
Msrc/modules/setident.c | 5++---
Msrc/modules/setname.c | 76++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------
Msrc/modules/silence.c | 7++++---
Msrc/modules/sinfo.c | 50+++++++++++++++++++++++++-------------------------
Msrc/modules/sjoin.c | 575+++++++++++++++++++++++++++++++++----------------------------------------------
Asrc/modules/slog.c | 190+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Dsrc/modules/snomasks/Makefile.in | 55-------------------------------------------------------
Dsrc/modules/snomasks/dccreject.c | 70----------------------------------------------------------------------
Msrc/modules/sqline.c | 6+++---
Msrc/modules/squit.c | 18+++++++++++-------
Msrc/modules/staff.c | 233++++---------------------------------------------------------------------------
Msrc/modules/starttls.c | 9++++-----
Msrc/modules/stats.c | 349++++++++++++++++++++++++++++++++-----------------------------------------------
Msrc/modules/sts.c | 6+++---
Msrc/modules/svsjoin.c | 4++--
Msrc/modules/svskill.c | 6+++---
Msrc/modules/svslusers.c | 4++--
Msrc/modules/svsmode.c | 218++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
Msrc/modules/svsmotd.c | 96+++++++++++++++++++++++++++++++++++++------------------------------------------
Msrc/modules/svsnick.c | 40++++++++++++++++++++++------------------
Msrc/modules/svsnline.c | 2+-
Msrc/modules/svsnolag.c | 6+++---
Msrc/modules/svsnoop.c | 12+++++++-----
Msrc/modules/svspart.c | 6+++---
Msrc/modules/svssilence.c | 8+++++---
Msrc/modules/svssno.c | 46+++++++++-------------------------------------
Msrc/modules/svswatch.c | 4++--
Msrc/modules/swhois.c | 4++--
Msrc/modules/targetfloodprot.c | 72++++++++++++++++++++++++++++++++++++------------------------------------
Msrc/modules/third/Makefile.in | 9++++++---
Msrc/modules/time.c | 4++--
Msrc/modules/tkl.c | 1321++++++++++++++++++++++++++++++++++++++++---------------------------------------
Msrc/modules/tkldb.c | 62+++++++++++++++++++++++++++++++-------------------------------
Msrc/modules/tls_antidos.c | 11+++++------
Asrc/modules/tls_cipher.c | 91+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/modules/topic.c | 126+++++++++++++++++++++++++++++++++++++++++--------------------------------------
Msrc/modules/trace.c | 22+++++++++++-----------
Msrc/modules/tsctl.c | 8+++++---
Msrc/modules/typing-indicator.c | 10+++++-----
Msrc/modules/umode2.c | 4++--
Asrc/modules/unreal_server_compat.c | 319+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/modules/unsqline.c | 6+++---
Msrc/modules/user.c | 22++++++++++------------
Msrc/modules/userhost-tag.c | 16++++++++--------
Msrc/modules/userhost.c | 8+++++---
Msrc/modules/userip-tag.c | 16++++++++--------
Msrc/modules/userip.c | 11++++++-----
Msrc/modules/usermodes/Makefile.in | 53++++++++---------------------------------------------
Msrc/modules/usermodes/bot.c | 25++++++++++++++++---------
Msrc/modules/usermodes/censor.c | 90++++++++++++++++++++++++++++++++++++++++----------------------------------------
Msrc/modules/usermodes/noctcp.c | 8++++----
Msrc/modules/usermodes/nokick.c | 10+++++-----
Msrc/modules/usermodes/privacy.c | 2+-
Msrc/modules/usermodes/privdeaf.c | 6+++---
Msrc/modules/usermodes/regonlymsg.c | 8++++----
Msrc/modules/usermodes/secureonlymsg.c | 18+++++++++---------
Msrc/modules/usermodes/servicebot.c | 31++++++++++++++++---------------
Msrc/modules/usermodes/showwhois.c | 6+++---
Asrc/modules/usermodes/wallops.c | 111+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/modules/vhost.c | 67+++++++++++++++++++++++++++++++++++++++----------------------------
Dsrc/modules/wallops.c | 77-----------------------------------------------------------------------------
Asrc/modules/watch-backend.c | 382+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/modules/watch.c | 256++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------
Msrc/modules/webirc.c | 110++++++++++++++++++++++++++++++++++++-------------------------------------------
Msrc/modules/webredir.c | 36++++++++++++++++++------------------
Msrc/modules/websocket.c | 383+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------
Msrc/modules/who_old.c | 121++++++++++++++++++++++++++++++++-----------------------------------------------
Msrc/modules/whois.c | 566++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------
Msrc/modules/whowas.c | 18++++++++++--------
Msrc/modules/whox.c | 122++++++++++++++++++++++++++++++++++---------------------------------------------
Dsrc/numeric.c | 1056-------------------------------------------------------------------------------
Msrc/openssl_hostname_validation.c | 24++++++++++++------------
Msrc/operclass.c | 6+++---
Msrc/parse.c | 161++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
Msrc/random.c | 14+++++++-------
Msrc/send.c | 488+++++++++++++++++++++++++------------------------------------------------------
Msrc/serv.c | 578++++++++++++++++++++++++++++++++++++-------------------------------------------
Msrc/socket.c | 512+++++++++++++++----------------------------------------------------------------
Msrc/support.c | 160++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------
Msrc/tls.c | 453++++++++++++++++++++++++++++++++++++++++---------------------------------------
Msrc/unrealdb.c | 43+++++++++++++++++++++++++++----------------
Dsrc/updconf.c | 1730-------------------------------------------------------------------------------
Dsrc/url.c | 458-------------------------------------------------------------------------------
Asrc/url_curl.c | 315+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Asrc/url_unreal.c | 1068+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/user.c | 418+++++++++++++++++++++++++++++++++++++++++++++++++------------------------------
Msrc/utf8.c | 60++++++++++++++++++++++++++++++++++++++++--------------------
Msrc/version.c.SH | 12+++++++++---
Msrc/whowas.c | 34+++++++++++++++++-----------------
Msrc/windows/UnrealIRCd.exe.manifest | 6+++---
Msrc/windows/gui.c | 119+++++++++++++++++++++++--------------------------------------------------------
Msrc/windows/service.c | 5++---
Msrc/windows/unrealinst.iss | 77++++++++++++++++++++++++++++++++++++++++++-----------------------------------
Msrc/windows/unrealsvc.c | 4++--
Msrc/windows/win.c | 32++++++++++++++++----------------
Msrc/windows/wingui.rc | 6+++---
Munrealircd.in | 17++++++++++++-----

341 files changed, 33388 insertions(+), 26435 deletions(-)

diff --git a/BSDmakefile b/BSDmakefile
@@ -0,0 +1,4 @@
+.DONE:
+	@echo "Please use GNU Make (gmake) to build UnrealIRCd"
+.DEFAULT:
+	@echo "Please use GNU Make (gmake) to build UnrealIRCd"
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
@@ -0,0 +1,5 @@
+Help out and make UnrealIRCd a better product!
+
+You can do so by reporting issues, testing, programming, documenting,
+translating, helping others, and more.
+See https://www.unrealircd.org/docs/Contributing
diff --git a/Config b/Config
@@ -1,7 +1,7 @@
 #!/bin/sh
 #
 # Config script for UnrealIRCd
-# (C) 2001-2019 The UnrealIRCd Team
+# (C) 2001-2021 The UnrealIRCd Team
 #
 # This configure script is free software; the UnrealIRCd Team gives 
 # unlimited permission to copy, distribute and modify as long as the
@@ -37,9 +37,6 @@ mkdir -p $TMPDIR
 mkdir -p $PRIVATELIBDIR
 
 # Do this even if we're not in advanced mode
-if [ "$SHOWLISTMODES" = "1" ] ; then
-	ARG="$ARG--with-showlistmodes "
-fi
 if [ "$ADVANCED" = "1" ] ; then
 if [ "$NOOPEROVERRIDE" = "1" ] ; then
 	ARG="$ARG--with-no-operoverride "
@@ -53,12 +50,21 @@ ARG="$ARG--enable-ssl "
 else
 ARG="$ARG--enable-ssl=$SSLDIR "
 fi
+# Ensure we install curl even if someone does ./Config -quick...
+if [ "x$CURLDIR" = "x$UNREALCWD/extras/curl" ]; then
+	INSTALLCURL=1
+else
+	# And that the path does not refer to eg an old unrealircd-1.2.3 either ;)
+	if echo "$CURLDIR"|egrep -qi extras.*curl; then
+		echo "WARNING: Potentially old cURL directory encountered ($CURLDIR)."
+		echo "I am changing the cURL directory to $UNREALCWD/extras/curl and forcing a rebuild of cURL."
+		CURLDIR="$UNREALCWD/extras/curl"
+		INSTALLCURL=1
+	fi
+fi
 if [ "$REMOTEINC" = "1" ] ; then
 ARG="$ARG--enable-libcurl=$CURLDIR "
 fi
-if [ "$PREFIXAQ" != "1" ]; then
-ARG="$ARG--disable-prefixaq "
-fi
 if [ "$MAXCONNECTIONS_REQUEST" != "auto" ]; then
 	ARG="$ARG--with-maxconnections=$MAXCONNECTIONS_REQUEST "
 fi
@@ -77,14 +83,19 @@ ARG="$ARG--with-scriptdir=$BASEPATH "
 ARG="$ARG--with-nick-history=$NICKNAMEHISTORYLENGTH "
 ARG="$ARG--with-permissions=$DEFPERM "
 ARG="$ARG--enable-dynamic-linking "
+if [ "$GEOIP" = "classic" ]; then
+	ARG="$ARG--enable-geoip-classic "
+fi
+if [ "$GEOIP" = "libmaxminddb" ]; then
+	ARG="$ARG--enable-libmaxminddb "
+fi
+if [ "$SANITIZER" = "asan" ]; then
+	ARG="$ARG--enable-asan "
+fi
 ARG="$ARG $EXTRAPARA "
 CONF="./configure $ARG"
 # remove possibly old instances of curl in ~/unrealircd/lib/
 rm -f $PRIVATELIBDIR/*curl* 1>/dev/null 2>&1
-# Ensure we install curl even if someone does ./Config -quick...
-if [ "x$CURLDIR" = "x$UNREALCWD/extras/curl" ]; then
-	INSTALLCURL=1
-fi
 if [ "x$INSTALLCURL" = "x1" ]; then
 	extras/curlinstall "$PRIVATELIBDIR" || exit 1
 fi
@@ -127,8 +138,8 @@ if [ "$QUICK" != "1" ] ; then
 				TEST="No"
 			fi
 			echo ""
-			echo "UnrealIRCd requires an SSL certificate in order to work."
-			echo "Do you want to generate an SSL certificate for the IRCd?"
+			echo "UnrealIRCd requires a TLS certificate in order to work."
+			echo "Do you want to generate a TLS certificate for the IRCd?"
 			echo "Only answer No if you already have one."
 			echo $n "[$TEST] -> $c"
 			read cc
@@ -152,62 +163,33 @@ if [ "$QUICK" != "1" ] ; then
 		if [ "$GENCERTIFICATE" = 1 ]; then
 			echo
 			echo "*******************************************************************************"
-			echo "Next you will be asked some questions in order to generate the SSL certificate."
+			echo "Next you will be asked some questions in order to generate the TLS certificate."
 			echo "IMPORTANT: If you don't own a domain or don't know what to answer, then you can"
 			echo "           simply press ENTER or use fictional names for each question!"
 			echo "*******************************************************************************"
 			echo "Press ENTER to continue"
 			read cc
-			make pem
+			$MAKE pem
 			echo "Certificate created successfully."
 			sleep 1
 		else
-			echo "Ok, not generating SSL certificate. Make sure that the certificate and key"
+			echo "Ok, not generating TLS certificate. Make sure that the certificate and key"
 			echo "are installed in conf/tls/server.cert.pem and conf/tls/server.key.pem prior to starting the IRCd."
 		fi
 	else
-		echo "SSL certificate already exists in configuration directory, no need to regenerate."
+		echo "TLS certificate already exists in configuration directory, no need to regenerate."
 	fi
 fi
 
 # Silently force a 'make clean' as otherwise part (or whole) of the
 # compiled source could be using different settings than the user
 # just requested when re-running ./Config.
-make clean 1>/dev/null 2>&1
+$MAKE clean 1>/dev/null 2>&1
 }
 
 RUN_ADVANCED () {
 TEST=""
 while [ -z "$TEST" ] ; do
-	if [ "$SHOWLISTMODES" = "1" ] ; then
-		TEST="Yes"
-	else
-		TEST="No"
-	fi
-	echo ""
-	echo "Do you want to show the modes a channel has set in the /list output?"
-	echo $n "[$TEST] -> $c"
-	read cc
-	if [ -z "$cc" ] ; then
-		cc=$TEST
-	fi
-	case "$cc" in
-	[Yy]*)
-		SHOWLISTMODES="1"
-		;;
-	[Nn]*)
-		SHOWLISTMODES=""
-		;;
-	*)
-		echo ""
-		echo "You must enter either Yes or No"
-		TEST=""
-		;;
-	esac
-done
-
-TEST=""
-while [ -z "$TEST" ] ; do
 	if [ "$NOOPEROVERRIDE" = "1" ] ; then
 		TEST="Yes"
 	else
@@ -271,16 +253,16 @@ UNREALCWD="`pwd`"
 BASEPATH="$HOME/unrealircd"
 DEFPERM="0600"
 SSLDIR=""
-NICKNAMEHISTORYLENGTH="100"
+NICKNAMEHISTORYLENGTH="2000"
 MAXCONNECTIONS_REQUEST="auto"
 REMOTEINC="1"
 CURLDIR=""
-PREFIXAQ="0"
-SHOWLISTMODES="0"
 NOOPEROVERRIDE=""
 OPEROVERRIDEVERIFY=""
 GENCERTIFICATE="1"
 EXTRAPARA=""
+SANITIZER=""
+GEOIP="classic"
 if [ "`eval echo -n 'a'`" = "-n a" ] ; then
 	c="\c"
 else
@@ -333,6 +315,33 @@ if [ "`id -u`" = "0" ]; then
 	exit
 fi
 
+# Check for gmake early...
+if [ "$MAKE" = "" ]; then
+	MAKE="make"
+fi
+
+if ! $MAKE --version 2>&1|grep -q "GNU Make"; then
+	# So $MAKE is not GNU make, but do we have gmake?
+	if gmake --version 2>&1|grep -q "GNU Make"; then
+		# Great, use that one!
+		MAKE="gmake"
+	else
+		# Both $MAKE and gmake are not GNU make, do we have a working $MAKE at all?
+		if $MAKE --version 1>/dev/null 2>&1; then
+			echo "Your system has 'make' but UnrealIRCd requires GNU Make ('gmake')"
+			echo "Please install 'gmake' (eg 'pkg install gmake' on BSD)."
+			exit 1
+		else
+			echo "Your system does not have the required tools installed to build UnrealIRCd."
+			echo "Please check https://www.unrealircd.org/docs/Installing_from_source"
+			echo "and install the required tools listed under 'Prerequisites'."
+			echo "After that, you can run ./Config again"
+			exit 1
+		fi
+	fi
+fi
+
+
 clear
 
 if [ -f "doc/Config.header" -a -z "$NOINTRO" ] ; then
@@ -347,7 +356,7 @@ echo "We will now ask you a number of questions. You can just press ENTER to acc
 echo ""
 
 # This needs to be updated each release so auto-upgrading works for settings, modules, etc!!:
-UNREALRELEASES="unrealircd-5.2.0 unrealircd-5.2.0-rc1 unrealircd-5.0.9.1 unrealircd-5.0.9 unrealircd-5.0.9-rc1 unrealircd-5.0.8 unrealircd-5.0.8-rc1 unrealircd-5.0.7 unrealircd-5.0.7-rc1 unrealircd-5.0.6 unrealircd-5.0.5.1 unrealircd-5.0.5 unrealircd-5.0.4 unrealircd-5.0.3.1 unrealircd-5.0.3 unrealircd-5.0.2 unrealircd-5.0.1 unrealircd-5.0.0"
+UNREALRELEASES="unrealircd-6.0.1 unrealircd-6.0.0 unrealircd-6.0.0-rc2 unrealircd-6.0.0-rc1 unrealircd-6.0.0-beta4 unrealircd-6.0.0-beta3 unrealircd-6.0.0-beta2 unrealircd-6.0.0-beta1 unrealircd-5.2.3 unrealircd-5.2.2 unrealircd-5.2.1.1 unrealircd-5.2.1 unrealircd-5.2.1-rc1 unrealircd-5.2.0.2 unrealircd-5.2.0.1 unrealircd-5.2.0 unrealircd-5.2.0-rc1 unrealircd-5.0.9.1 unrealircd-5.0.9 unrealircd-5.0.9-rc1 unrealircd-5.0.8 unrealircd-5.0.8-rc1 unrealircd-5.0.7 unrealircd-5.0.7-rc1 unrealircd-5.0.6"
 if [ -f "config.settings" ]; then
 	. ./config.settings
 else
@@ -421,7 +430,7 @@ fi
 TEST="$BASEPATH"
 echo ""
 echo "In what directory do you want to install UnrealIRCd?"
-echo "(Note: UnrealIRCd 5 will need to be installed somewhere."
+echo "(Note: UnrealIRCd 6 will need to be installed somewhere."
 echo " If this directory does not exist it will be created.)"
 echo $n "[$TEST] -> $c"
 read cc
@@ -507,9 +516,12 @@ while [ -z "$TEST" ] ; do
 		TEST="No"
 	fi
 	echo ""
-	echo "Do you want to enable remote includes?"
-	echo "This allows stuff like this in your configuration file:"
-	echo "include \"https://www.somesite.org/files/opers.conf\";"
+	echo "UnrealIRCd comes with support for 'remote includes', this allows things like:"
+	echo "include \"https://www.example.org/files/opers.conf\";"
+	echo "Do you want to compile with the libcurl library to enable additional protocols?"
+	echo "If you answer 'No' then only https:// links will work for remote includes."
+	echo "Answer 'Yes' if you need other protocols, such as plaintext http, ftp, tftp or smb."
+	echo "Most people answer 'No' here because they don't use remote includes or only need https."
 	echo $n "[$TEST] -> $c"
 	read cc
 	if [ -z "$cc" ] ; then
@@ -663,32 +675,22 @@ fi
 
 TEST=""
 while [ -z "$TEST" ] ; do
-	if [ "$PREFIXAQ" = "1" ] ; then
-		TEST="Yes"
-	else
-		TEST="No"
-	fi
+	TEST="$NICKNAMEHISTORYLENGTH"
 	echo ""
-	echo "Do you want to enable prefixes for chanadmin and chanowner?"
-	echo "This will give +a the & prefix and ~ for +q (just like +o is @)"
-	echo "Supported by the major clients (mIRC, xchat, epic, eggdrop, Klient,"
-	echo "PJIRC, irssi, CGI:IRC, etc.)"
-	echo "This feature should be enabled/disabled network-wide."
+	echo "How far back do you want to keep the nickname history?"
 	echo $n "[$TEST] -> $c"
 	read cc
 	if [ -z "$cc" ] ; then
-		cc=$TEST
+		NICKNAMEHISTORYLENGTH=$TEST
+		break
 	fi
 	case "$cc" in
-	[Yy]*)
-		PREFIXAQ="1"
-		;;
-	[Nn]*)
-		PREFIXAQ=""
+	[1-9]*)
+		NICKNAMEHISTORYLENGTH="$cc"
 		;;
 	*)
 		echo ""
-		echo "You must enter either Yes or No"
+		echo "You must enter a number"
 		TEST=""
 		;;
 	esac
@@ -696,22 +698,34 @@ done
 
 TEST=""
 while [ -z "$TEST" ] ; do
-	TEST="$NICKNAMEHISTORYLENGTH"
+	TEST="$GEOIP"
 	echo ""
-	echo "How far back do you want to keep the nickname history?"
+	echo "GeoIP is a feature that allows converting an IP address to a location (country)"
+	echo "You have three options in UnrealIRCd:"
+	echo "     classic: This is the DEFAULT geoip engine that should work on all systems"
+	echo "libmaxminddb: This uses the libmaxminddb library. If you want to use it then"
+	echo "              you need to install the libmaxminddb library on your system first"
+	echo "        none: Don't built with any geoip feature"
+	echo "Choose one of: classic, libmaxminddb, none"
 	echo $n "[$TEST] -> $c"
 	read cc
 	if [ -z "$cc" ] ; then
-		NICKNAMEHISTORYLENGTH=$TEST
+		GEOIP=$TEST
 		break
 	fi
 	case "$cc" in
-	[1-9]*)
-		NICKNAMEHISTORYLENGTH="$cc"
+	classic)
+		GEOIP="$cc"
+		;;
+	libmaxminddb)
+		GEOIP="$cc"
+		;;
+	none)
+		GEOIP="$cc"
 		;;
 	*)
 		echo ""
-		echo "You must enter a number"
+		echo "Invalid choice: $cc"
 		TEST=""
 		;;
 	esac
@@ -753,6 +767,42 @@ if [ -n "$ADVANCED" ] ; then
 	RUN_ADVANCED
 fi
 
+TEST=""
+while [ -z "$TEST" ] ; do
+	if [ "$SANITIZER" = "asan" ] ; then
+		TEST="Yes"
+	else
+		TEST="No"
+	fi
+	echo ""
+	echo "Are you running UnrealIRCd as a test, debugging a problem or developing a module?"
+	echo "Then it is possible to run with AddressSanitizer enabled. This will make it"
+	echo "catch bugs such as out-of-bounds and other memory corruption issues, which can"
+	echo "be really helpful in some cases. The downside is that it will consume a lot"
+	echo "more memory and run slower too. So, only answer 'Yes' if you are OK with this."
+	echo "Also, on some systems (notably FreeBSD), when you enable AddressSanitizer,"
+	echo "UnrealIRCd may fail to start. So when in doubt, answer 'No'."
+	echo "Do you want to enable AddressSanitizer?"
+	echo $n "[$TEST] -> $c"
+	read cc
+	if [ -z "$cc" ] ; then
+		cc=$TEST
+	fi
+	case "$cc" in
+	[Yy]*)
+		SANITIZER="asan"
+		;;
+	[Nn]*)
+		SANITIZER=""
+		;;
+	*)
+		echo ""
+		echo "You must enter either Yes or No"
+		TEST=""
+		;;
+	esac
+done
+
 TEST="$EXTRAPARA"
 echo ""
 echo "Would you like to pass any custom parameters to configure?"
@@ -784,17 +834,17 @@ CACHEDIR="$CACHEDIR"
 DOCDIR="$DOCDIR"
 TMPDIR="$TMPDIR"
 PRIVATELIBDIR="$PRIVATELIBDIR"
-PREFIXAQ="$PREFIXAQ"
 MAXCONNECTIONS_REQUEST="$MAXCONNECTIONS_REQUEST"
 NICKNAMEHISTORYLENGTH="$NICKNAMEHISTORYLENGTH"
+GEOIP="$GEOIP"
 DEFPERM="$DEFPERM"
 SSLDIR="$SSLDIR"
 REMOTEINC="$REMOTEINC"
 CURLDIR="$CURLDIR"
-SHOWLISTMODES="$SHOWLISTMODES"
 NOOPEROVERRIDE="$NOOPEROVERRIDE"
 OPEROVERRIDEVERIFY="$OPEROVERRIDEVERIFY"
 GENCERTIFICATE="$GENCERTIFICATE"
+SANITIZER="$SANITIZER"
 EXTRAPARA="$EXTRAPARA"
 ADVANCED="$ADVANCED"
 __EOF__
@@ -808,16 +858,17 @@ cat << __EOF__
 |_______________________________________________________________________|
 |_______________________________________________________________________|
 |                                                                       |
-| Now all you have to do is type 'make' and let it compile. When that's |
-| done, you will receive other instructions on what to do next.         |
+|                        - The UnrealIRCd Team -                        |
 |                                                                       |
+|              Bram Matthys (Syzop) - syzop@unrealircd.org              |
+|       Krzysztof Beresztant (k4be) - k4be@unrealircd.org               |
+|                            Gottem - gottem@unrealircd.org             |
+|                                 i - i@unrealircd.org                  |
 |_______________________________________________________________________|
 |_______________________________________________________________________|
-|                        - The UnrealIRCd Team -                        |
 |                                                                       |
-| * Bram Matthys (Syzop)     syzop@unrealircd.org                       |
-| * Gottem                   gottem@unrealircd.org                      |
-| * i                        i@unrealircd.org                           |
+| Now all you have to do is type '$MAKE' and let it compile. When that's |
+| done, you will receive other instructions on what to do next.         |
 |_______________________________________________________________________|
 __EOF__
 
diff --git a/Makefile.in b/Makefile.in
@@ -34,11 +34,11 @@ FROMDOS=/home/cmunk/bin/4dos
 #
 
 #XCFLAGS=-O -g -export-dynamic
-IRCDLIBS=@IRCDLIBS@ @PCRE2_LIBS@ @ARGON2_LIBS@ @CARES_LIBS@ @SODIUM_LIBS@ @PTHREAD_LIBS@
+IRCDLIBS=@IRCDLIBS@ @PCRE2_LIBS@ @ARGON2_LIBS@ @CARES_LIBS@ @SODIUM_LIBS@ @JANSSON_LIBS@ @PTHREAD_LIBS@
 CRYPTOLIB=@CRYPTOLIB@
 OPENSSLINCLUDES=
 
-XCFLAGS=@PTHREAD_CFLAGS@ @PCRE2_CFLAGS@ @ARGON2_CFLAGS@ @CARES_CFLAGS@ @SODIUM_CFLAGS@ @CFLAGS@ @HARDEN_CFLAGS@ @CPPFLAGS@
+XCFLAGS=@PTHREAD_CFLAGS@ @PCRE2_CFLAGS@ @ARGON2_CFLAGS@ @CARES_CFLAGS@ @SODIUM_CFLAGS@ @JANSSON_CFLAGS@ @CFLAGS@ @HARDEN_CFLAGS@ @CPPFLAGS@
 #
 # use the following on MIPS:
 #CFLAGS= -systype bsd43 -DSYSTYPE_BSD43 -I$(INCLUDEDIR)
@@ -89,7 +89,14 @@ XCFLAGS=@PTHREAD_CFLAGS@ @PCRE2_CFLAGS@ @ARGON2_CFLAGS@ @CARES_CFLAGS@ @SODIUM_C
 #          you are not defining CMDLINE_CONFIG 
 IRCDMODE = 711
 
+# Objects that are optional due to optional libraries:
 URL=@URL@
+GEOIP_CLASSIC_OBJECTS=@GEOIP_CLASSIC_OBJECTS@
+GEOIP_CLASSIC_LIBS=@GEOIP_CLASSIC_LIBS@
+GEOIP_CLASSIC_CFLAGS=@GEOIP_CLASSIC_CFLAGS@
+GEOIP_MAXMIND_OBJECTS=@GEOIP_MAXMIND_OBJECTS@
+LIBMAXMINDDB_CFLAGS=@LIBMAXMINDDB_CFLAGS@
+LIBMAXMINDDB_LIBS=@LIBMAXMINDDB_LIBS@
 
 # Where is your openssl binary
 OPENSSLPATH=@OPENSSLPATH@
@@ -116,7 +123,13 @@ MAKEARGS =	'CFLAGS=${CFLAGS}' 'CC=${CC}' 'IRCDLIBS=${IRCDLIBS}' \
 		'SHELL=${SHELL}' \
 		'CRYPTOLIB=${CRYPTOLIB}' \
 		'CRYPTOINCLUDES=${CRYPTOINCLUDES}' \
-		'URL=${URL}'
+		'URL=${URL}' \
+		'GEOIP_CLASSIC_OBJECTS=${GEOIP_CLASSIC_OBJECTS}' \
+		'GEOIP_CLASSIC_LIBS=${GEOIP_CLASSIC_LIBS}' \
+		'GEOIP_CLASSIC_CFLAGS=${GEOIP_CLASSIC_CFLAGS}' \
+		'GEOIP_MAXMIND_OBJECTS=${GEOIP_MAXMIND_OBJECTS}' \
+		'LIBMAXMINDDB_CFLAGS=${LIBMAXMINDDB_CFLAGS}' \
+		'LIBMAXMINDDB_LIBS=${LIBMAXMINDDB_LIBS}'
 
 custommodule:
 	@if test -z "${MODULEFILE}"; then echo "Please set MODULEFILE when calling \`\`make custommodule''. For example, \`\`make custommodule MODULEFILE=callerid''." >&2; exit 1; fi
@@ -135,7 +148,7 @@ build: Makefile
 	done
 	@echo ''
 	@echo '* UnrealIRCd compiled successfully'
-	@echo '* YOU ARE NOT DONE YET! Run "make install" to install UnrealIRCd !'
+	@echo '* YOU ARE NOT DONE YET! Run "${MAKE} install" to install UnrealIRCd !'
 	@echo ''
 
 clean:
@@ -183,9 +196,6 @@ install: all
 	$(INSTALL) -m 0700 -d $(DESTDIR)@MODULESDIR@/chanmodes
 	@rm -f $(DESTDIR)@MODULESDIR@/chanmodes/*.so 1>/dev/null 2>&1
 	$(INSTALL) -m 0700 src/modules/chanmodes/*.so $(DESTDIR)@MODULESDIR@/chanmodes
-	$(INSTALL) -m 0700 -d $(DESTDIR)@MODULESDIR@/snomasks
-	@rm -f $(DESTDIR)@MODULESDIR@/snomasks/*.so 1>/dev/null 2>&1
-	$(INSTALL) -m 0700 src/modules/snomasks/*.so $(DESTDIR)@MODULESDIR@/snomasks
 	$(INSTALL) -m 0700 -d $(DESTDIR)@MODULESDIR@/extbans
 	@rm -f $(DESTDIR)@MODULESDIR@/extbans/*.so 1>/dev/null 2>&1
 	$(INSTALL) -m 0700 src/modules/extbans/*.so $(DESTDIR)@MODULESDIR@/extbans
@@ -248,7 +258,7 @@ pem:	extras/tls.cnf
               -config extras/tls.cnf -sha256 -out server.req.pem \
               -key server.key.pem -nodes
 	@echo "Generating self-signed certificate..."
-	$(OPENSSLPATH) req -x509 -days 3650 -sha256 -in server.req.pem \
+	$(OPENSSLPATH) req -x509 -days 3650 -sha256 -nodes -in server.req.pem \
                -key server.key.pem -out server.cert.pem
 	@echo "Setting permissions on server.*.pem files..."
 	chmod o-rwx server.req.pem server.key.pem server.cert.pem
diff --git a/Makefile.windows b/Makefile.windows
@@ -25,15 +25,25 @@ MT=mt
 #ARGON2LIB="Argon2RefDll.lib"
 
 ### SODIUM ###
-#SODIUM_LIB_DIR="C:\dev\unrealircd-5-libs\libsodium\......."
-#SODIUM_INC_DIR="C:\dev\unrealircd-5-libs\libsodium\......."
+#SODIUM_LIB_DIR="C:\dev\unrealircd-6-libs\libsodium\......."
+#SODIUM_INC_DIR="C:\dev\unrealircd-6-libs\libsodium\......."
 #SODIUMLIB="libsodium.lib"
 
+### JANSSON ###
+#JANSSON_LIB_DIR="C:\dev\unrealircd-6-libs\jansson\lib"
+#JANSSON_INC_DIR="C:\dev\unrealircd-6-libs\jansson\include"
+#JANSSONLIB="jansson.lib"
+
 ### C-ARES ####
 #CARES_LIB_DIR="C:\dev\c-ares\vc\cares\dll-release"
 #CARES_INC_DIR="C:\dev\c-ares"
 #CARESLIB="cares.lib"
 
+### GEOIP CLASSIC ###
+#GEOIPCLASSIC_LIB_DIR="c:\dev\unrealircd-6-libs\GeoIP\libGeoIP" ^
+#GEOIPCLASSIC_INC_DIR="c:\dev\unrealircd-6-libs\GeoIP\libGeoIP" ^
+#GEOIPCLASSICLIB="GeoIP.lib"
+
 ##### REMOTE INCLUDES ####
 #To enable remote include support you must have libcurl installed on your
 #system and it must have ares support enabled.
@@ -106,9 +116,16 @@ SODIUM_INC=/I "$(SODIUM_INC_DIR)"
 SODIUM_LIB=/LIBPATH:"$(SODIUM_LIB_DIR)"
 !ENDIF
 
+!IFDEF JANSSON_INC_DIR
+JANSSON_INC=/I "$(JANSSON_INC_DIR)"
+!ENDIF
+!IFDEF JANSSON_LIB_DIR
+JANSSON_LIB=/LIBPATH:"$(JANSSON_LIB_DIR)"
+!ENDIF
+
 !IFDEF USE_REMOTEINC
 CURLCFLAGS=/D USE_LIBCURL
-CURLOBJ=SRC/URL.OBJ
+CURLOBJ=SRC/URL_CURL.OBJ
 CURLLIB=libcurl.lib
 !IFDEF LIBCURL_INC_DIR
 LIBCURL_INC=/I "$(LIBCURL_INC_DIR)"
@@ -137,15 +154,15 @@ DBGLFLAG=/debug
 MODDBGCFLAG=/LDd /MD /Zi
 !ENDIF 
 
-STDOPTIONS=$(PCRE2_INC) $(ARGON2_INC) $(SODIUM_INC) $(CARES_INC) $(LIBCURL_INC) $(LIBRESSL_INC) /J /I ./INCLUDE /nologo \
+STDOPTIONS=$(PCRE2_INC) $(ARGON2_INC) $(SODIUM_INC) $(JANSSON_INC) $(CARES_INC) $(LIBCURL_INC) $(LIBRESSL_INC) \
+ /J /I ./INCLUDE /nologo \
  $(CURLCFLAGS) /D FD_SETSIZE=16384 $(SSLCFLAGS) /D _CRT_SECURE_NO_DEPRECATE /D _CRT_NONSTDC_NO_DEPRECATE \
  /D FAKELAG_CONFIGURABLE=1 \
- /W3 /wd4267 /wd4101 /wd4018 /wd4244 /wd4996 /WX \
- /analyze:ruleset extras\VStudioAnalyze.ruleset
+ /W3 /wd4267 /wd4101 /wd4018 /wd4244 /wd4996 /WX /analyze:ruleset extras\VStudioAnalyze.ruleset
 STDLIBS=$(CARES_LIB) $(CARESLIB) $(PCRE2_LIB) $(PCRE2LIB) $(ARGON2_LIB) $(ARGON2LIB) \
- $(SODIUM_LIB) $(SODIUMLIB) $(LIBRESSL_LIB) $(SSLLIB) $(LIBCURL_LIB) $(CURLLIB)
-CFLAGS=$(DBGCFLAG) $(STDOPTIONS) /c /Fosrc/
-CFLAGSST=$(DBGCFLAGST) $(STDOPTIONS) /c /Fosrc/
+ $(SODIUM_LIB) $(SODIUMLIB) $(JANSSON_LIB) $(JANSSONLIB) $(LIBRESSL_LIB) $(SSLLIB) $(LIBCURL_LIB) $(CURLLIB)
+CFLAGS=$(DBGCFLAG) $(STDOPTIONS) /FS /MP1 /c /Fosrc/
+CFLAGSST=$(DBGCFLAGST) $(STDOPTIONS) /FS /MP1 /c /Fosrc/
 LFLAGS=kernel32.lib user32.lib gdi32.lib shell32.lib ws2_32.lib advapi32.lib \
  dbghelp.lib oldnames.lib comctl32.lib comdlg32.lib $(STDLIBS) \
  /def:UnrealIRCd.def /implib:UnrealIRCd.lib \
@@ -157,203 +174,249 @@ INCLUDES=./include/struct.h ./include/config.h ./include/sys.h \
  ./include/common.h ./include/version.h ./include/h.h ./include/numeric.h \
  ./include/msg.h ./include/setup.h ./include/dynconf.h
 
-EXP_OBJ_FILES=SRC/CHANNEL.OBJ SRC/SEND.OBJ SRC/SOCKET.OBJ \
- SRC/CONF.OBJ SRC/CONF_PREPROCESSOR.OBJ \
- SRC/FDLIST.OBJ SRC/DBUF.OBJ  \
- SRC/HASH.OBJ SRC/PARSE.OBJ SRC/IRCD.OBJ \
- SRC/WHOWAS.OBJ \
- SRC/MISC.OBJ SRC/MATCH.OBJ SRC/CRULE.OBJ \
- SRC/DEBUG.OBJ  SRC/SUPPORT.OBJ SRC/LIST.OBJ \
- SRC/NUMERIC.OBJ \
- SRC/SERV.OBJ SRC/USER.OBJ \
- SRC/VERSION.OBJ SRC/IRCSPRINTF.OBJ \
- SRC/SCACHE.OBJ SRC/DNS.OBJ SRC/MODULES.OBJ \
- SRC/ALIASES.OBJ SRC/API-EVENT.OBJ SRC/API-USERMODE.OBJ SRC/AUTH.OBJ SRC/TLS.OBJ \
- SRC/RANDOM.OBJ SRC/API-CHANNELMODE.OBJ SRC/API-MODDATA.OBJ SRC/MEMPOOL.OBJ \
- SRC/DISPATCH.OBJ SRC/API-ISUPPORT.OBJ SRC/API-COMMAND.OBJ \
- SRC/API-CLICAP.OBJ SRC/API-MESSAGETAG.OBJ SRC/API-HISTORY-BACKEND.OBJ \
- SRC/API-EXTBAN.OBJ SRC/API-EFUNCTIONS.OBJ SRC/CRYPT_BLOWFISH.OBJ \
- SRC/OPERCLASS.OBJ SRC/UPDCONF.OBJ SRC/CRASHREPORT.OBJ SRC/UNREALDB.OBJ \
- SRC/OPENSSL_HOSTNAME_VALIDATION.OBJ \
- SRC/UTF8.OBJ $(CURLOBJ)
-
-OBJ_FILES=$(EXP_OBJ_FILES) SRC/GUI.OBJ SRC/SERVICE.OBJ SRC/WINDEBUG.OBJ SRC/RTF.OBJ \
- SRC/EDITOR.OBJ SRC/WIN.OBJ 
-
-DLL_FILES=SRC/MODULES/CLOAK.DLL \
- SRC/MODULES/CHGHOST.DLL SRC/MODULES/SDESC.DLL SRC/MODULES/SETIDENT.DLL \
- SRC/MODULES/SETNAME.DLL SRC/MODULES/SETHOST.DLL SRC/MODULES/CHGIDENT.DLL \
- SRC/MODULES/SVSMOTD.DLL SRC/MODULES/SVSNLINE.DLL SRC/MODULES/WHO_OLD.DLL \
- SRC/MODULES/WHOX.DLL \
- SRC/MODULES/SWHOIS.DLL SRC/MODULES/SVSMODE.DLL SRC/MODULES/AWAY.DLL \
- SRC/MODULES/SVSNOOP.DLL SRC/MODULES/MKPASSWD.DLL \
- SRC/MODULES/SVSNICK.DLL \
- SRC/MODULES/CHGNAME.DLL \
- SRC/MODULES/LAG.DLL SRC/MODULES/MESSAGE.DLL \
- SRC/MODULES/OPER.DLL SRC/MODULES/PINGPONG.DLL SRC/MODULES/QUIT.DLL \
- SRC/MODULES/SENDUMODE.DLL \
- SRC/MODULES/SQLINE.DLL SRC/MODULES/KILL.DLL SRC/MODULES/TSCTL.DLL \
- SRC/MODULES/UNSQLINE.DLL \
- SRC/MODULES/WHOIS.DLL SRC/MODULES/TKL.DLL SRC/MODULES/VHOST.DLL \
- SRC/MODULES/CYCLE.DLL SRC/MODULES/SVSJOIN.DLL SRC/MODULES/SVSPART.DLL \
- SRC/MODULES/SVSLUSERS.DLL SRC/MODULES/SVSWATCH.DLL SRC/MODULES/SVSSILENCE.DLL \
- SRC/MODULES/SENDSNO.DLL SRC/MODULES/SVSSNO.DLL SRC/MODULES/SAJOIN.DLL \
- SRC/MODULES/SAPART.DLL SRC/MODULES/SAMODE.DLL SRC/MODULES/KICK.DLL \
- SRC/MODULES/TOPIC.DLL SRC/MODULES/INVITE.DLL SRC/MODULES/LIST.DLL \
- SRC/MODULES/TIME.DLL SRC/MODULES/SVSKILL.DLL SRC/MODULES/KNOCK.DLL \
- SRC/MODULES/UMODE2.DLL SRC/MODULES/SQUIT.DLL SRC/MODULES/PROTOCTL.DLL \
- SRC/MODULES/SJOIN.DLL SRC/MODULES/PASS.DLL SRC/MODULES/USERHOST.DLL \
- SRC/MODULES/ISON.DLL SRC/MODULES/SILENCE.DLL \
- SRC/MODULES/ADDMOTD.DLL SRC/MODULES/ADDOMOTD.DLL SRC/MODULES/WALLOPS.DLL \
- SRC/MODULES/GLOBOPS.DLL SRC/MODULES/LOCOPS.DLL \
- SRC/MODULES/ADMIN.DLL SRC/MODULES/TRACE.DLL SRC/MODULES/NETINFO.DLL \
- SRC/MODULES/LINKS.DLL SRC/MODULES/HELP.DLL SRC/MODULES/RULES.DLL \
- SRC/MODULES/CLOSE.DLL SRC/MODULES/MAP.DLL SRC/MODULES/EOS.DLL \
- SRC/MODULES/SERVER.DLL SRC/MODULES/STATS.DLL \
- SRC/MODULES/DCCDENY.DLL SRC/MODULES/WHOWAS.DLL \
- SRC/MODULES/CONNECT.DLL SRC/MODULES/DCCALLOW.DLL SRC/MODULES/USERIP.DLL \
- SRC/MODULES/NICK.DLL SRC/MODULES/USER.DLL SRC/MODULES/MODE.DLL \
- SRC/MODULES/WATCH.DLL SRC/MODULES/PART.DLL SRC/MODULES/JOIN.DLL \
- SRC/MODULES/MOTD.DLL SRC/MODULES/OPERMOTD.DLL SRC/MODULES/BOTMOTD.DLL \
- SRC/MODULES/LUSERS.DLL SRC/MODULES/NAMES.DLL SRC/MODULES/SVSNOLAG.DLL \
- SRC/MODULES/STARTTLS.DLL \
- SRC/MODULES/WEBREDIR.DLL \
- SRC/MODULES/CAP.DLL \
- SRC/MODULES/SASL.DLL \
- SRC/MODULES/TLS_ANTIDOS.DLL \
- SRC/MODULES/MD.DLL \
- SRC/MODULES/CERTFP.DLL \
- SRC/MODULES/WEBIRC.DLL \
- SRC/MODULES/WEBSOCKET.DLL \
- SRC/MODULES/BLACKLIST.DLL \
- SRC/MODULES/JOINTHROTTLE.DLL \
- SRC/MODULES/ANTIRANDOM.DLL \
- SRC/MODULES/HIDESERVER.DLL \
- SRC/MODULES/JUMPSERVER.DLL \
- SRC/MODULES/IRCOPS.DLL \
- SRC/MODULES/STAFF.DLL \
- SRC/MODULES/NOCODES.DLL \
- SRC/MODULES/CHARSYS.DLL \
- SRC/MODULES/ANTIMIXEDUTF8.DLL \
- SRC/MODULES/AUTHPROMPT.DLL \
- SRC/MODULES/SINFO.DLL \
- SRC/MODULES/REPUTATION.DLL \
- SRC/MODULES/CONNTHROTTLE.DLL \
- SRC/MODULES/CHANMODES/CENSOR.DLL \
- SRC/MODULES/CHANMODES/DELAYJOIN.DLL \
- SRC/MODULES/CHANMODES/FLOODPROT.DLL \
- SRC/MODULES/CHANMODES/ISSECURE.DLL \
- SRC/MODULES/CHANMODES/LINK.DLL \
- SRC/MODULES/CHANMODES/NOCOLOR.DLL \
- SRC/MODULES/CHANMODES/NOCTCP.DLL \
- SRC/MODULES/CHANMODES/NOINVITE.DLL \
- SRC/MODULES/CHANMODES/NOKICK.DLL \
- SRC/MODULES/CHANMODES/NOKNOCK.DLL \
- SRC/MODULES/CHANMODES/NONICKCHANGE.DLL \
- SRC/MODULES/CHANMODES/NONOTICE.DLL \
- SRC/MODULES/CHANMODES/OPERONLY.DLL \
- SRC/MODULES/CHANMODES/PERMANENT.DLL \
- SRC/MODULES/CHANMODES/REGONLY.DLL \
- SRC/MODULES/CHANMODES/REGONLYSPEAK.DLL \
- SRC/MODULES/CHANMODES/SECUREONLY.DLL \
- SRC/MODULES/CHANMODES/STRIPCOLOR.DLL \
- SRC/MODULES/CHANMODES/HISTORY.DLL \
- SRC/MODULES/USERMODES/CENSOR.DLL \
- SRC/MODULES/USERMODES/NOCTCP.DLL \
- SRC/MODULES/USERMODES/BOT.DLL \
- SRC/MODULES/USERMODES/SERVICEBOT.DLL \
- SRC/MODULES/USERMODES/SHOWWHOIS.DLL \
- SRC/MODULES/USERMODES/PRIVACY.DLL \
- SRC/MODULES/USERMODES/NOKICK.DLL \
- SRC/MODULES/USERMODES/REGONLYMSG.DLL \
- SRC/MODULES/USERMODES/PRIVDEAF.DLL \
- SRC/MODULES/USERMODES/SECUREONLYMSG.DLL \
- SRC/MODULES/SNOMASKS/DCCREJECT.DLL \
- SRC/MODULES/EXTBANS/ACCOUNT.DLL \
- SRC/MODULES/EXTBANS/INCHANNEL.DLL \
- SRC/MODULES/EXTBANS/JOIN.DLL \
- SRC/MODULES/EXTBANS/NICKCHANGE.DLL \
- SRC/MODULES/EXTBANS/QUIET.DLL \
- SRC/MODULES/EXTBANS/REALNAME.DLL \
- SRC/MODULES/EXTBANS/OPERCLASS.DLL \
- SRC/MODULES/EXTBANS/CERTFP.DLL \
- SRC/MODULES/EXTBANS/TEXTBAN.DLL \
- SRC/MODULES/EXTBANS/MSGBYPASS.DLL \
- SRC/MODULES/EXTBANS/TIMEDBAN.DLL \
- SRC/MODULES/EXTBANS/PARTMSG.DLL \
- SRC/MODULES/EXTBANS/SECURITYGROUP.DLL \
- SRC/MODULES/ACCOUNT-NOTIFY.DLL \
- SRC/MODULES/MESSAGE-TAGS.DLL \
- SRC/MODULES/BATCH.DLL \
- SRC/MODULES/ACCOUNT-TAG.DLL \
- SRC/MODULES/LABELED-RESPONSE.DLL \
- SRC/MODULES/LINK-SECURITY.DLL \
- SRC/MODULES/MESSAGE-IDS.DLL \
- SRC/MODULES/PLAINTEXT-POLICY.DLL \
- SRC/MODULES/SERVER-TIME.DLL \
- SRC/MODULES/STS.DLL \
- SRC/MODULES/TKLDB.DLL \
- SRC/MODULES/CHANNELDB.DLL \
- SRC/MODULES/HISTORY_BACKEND_MEM.DLL \
- SRC/MODULES/HISTORY_BACKEND_NULL.DLL \
- SRC/MODULES/RESTRICT-COMMANDS.DLL \
- SRC/MODULES/RMTKL.DLL \
- SRC/MODULES/ECHO-MESSAGE.DLL \
- SRC/MODULES/USERIP-TAG.DLL \
- SRC/MODULES/USERHOST-TAG.DLL \
- SRC/MODULES/BOT-TAG.DLL \
- SRC/MODULES/REPLY-TAG.DLL \
- SRC/MODULES/REQUIRE-MODULE.DLL \
- SRC/MODULES/IDENT_LOOKUP.DLL \
- SRC/MODULES/HISTORY.DLL \
- SRC/MODULES/CHATHISTORY.DLL \
- SRC/MODULES/TARGETFLOODPROT.DLL \
- SRC/MODULES/TYPING-INDICATOR.DLL \
- SRC/MODULES/CLIENTTAGDENY.DLL
+EXP_OBJ_FILES=src/channel.obj src/send.obj src/socket.obj \
+ src/conf.obj src/conf_preprocessor.obj \
+ src/fdlist.obj src/dbuf.obj  \
+ src/hash.obj src/parse.obj src/ircd.obj \
+ src/whowas.obj \
+ src/misc.obj src/match.obj src/crule.obj \
+ src/debug.obj  src/support.obj src/list.obj \
+ src/serv.obj src/user.obj \
+ src/version.obj src/ircsprintf.obj \
+ src/scache.obj src/dns.obj src/modules.obj \
+ src/aliases.obj src/api-event.obj src/api-usermode.obj src/auth.obj src/tls.obj \
+ src/random.obj src/api-channelmode.obj src/api-moddata.obj src/mempool.obj \
+ src/dispatch.obj src/api-isupport.obj src/api-command.obj \
+ src/api-clicap.obj src/api-messagetag.obj src/api-history-backend.obj \
+ src/api-extban.obj src/api-efunctions.obj src/crypt_blowfish.obj \
+ src/operclass.obj src/crashreport.obj src/unrealdb.obj \
+ src/openssl_hostname_validation.obj \
+ src/utf8.obj src/log.obj $(CURLOBJ)
+
+OBJ_FILES=$(EXP_OBJ_FILES) src/gui.obj src/service.obj src/windebug.obj src/rtf.obj \
+ src/editor.obj src/win.obj 
+
+DLL_FILES=\
+ src/modules/account-notify.dll \
+ src/modules/account-tag.dll \
+ src/modules/addmotd.dll \
+ src/modules/addomotd.dll \
+ src/modules/admin.dll \
+ src/modules/antimixedutf8.dll \
+ src/modules/antirandom.dll \
+ src/modules/authprompt.dll \
+ src/modules/away.dll \
+ src/modules/batch.dll \
+ src/modules/blacklist.dll \
+ src/modules/botmotd.dll \
+ src/modules/bot-tag.dll \
+ src/modules/cap.dll \
+ src/modules/certfp.dll \
+ src/modules/chanmodes/chanowner.dll \
+ src/modules/chanmodes/chanadmin.dll \
+ src/modules/chanmodes/chanop.dll \
+ src/modules/chanmodes/halfop.dll \
+ src/modules/chanmodes/voice.dll \
+ src/modules/chanmodes/censor.dll \
+ src/modules/chanmodes/delayjoin.dll \
+ src/modules/chanmodes/floodprot.dll \
+ src/modules/chanmodes/history.dll \
+ src/modules/chanmodes/inviteonly.dll \
+ src/modules/chanmodes/isregistered.dll \
+ src/modules/chanmodes/issecure.dll \
+ src/modules/chanmodes/key.dll \
+ src/modules/chanmodes/limit.dll \
+ src/modules/chanmodes/link.dll \
+ src/modules/chanmodes/moderated.dll \
+ src/modules/chanmodes/nocolor.dll \
+ src/modules/chanmodes/noctcp.dll \
+ src/modules/chanmodes/noexternalmsgs.dll \
+ src/modules/chanmodes/noinvite.dll \
+ src/modules/chanmodes/nokick.dll \
+ src/modules/chanmodes/noknock.dll \
+ src/modules/chanmodes/nonickchange.dll \
+ src/modules/chanmodes/nonotice.dll \
+ src/modules/chanmodes/operonly.dll \
+ src/modules/chanmodes/permanent.dll \
+ src/modules/chanmodes/private.dll \
+ src/modules/chanmodes/regonly.dll \
+ src/modules/chanmodes/regonlyspeak.dll \
+ src/modules/chanmodes/secret.dll \
+ src/modules/chanmodes/secureonly.dll \
+ src/modules/chanmodes/stripcolor.dll \
+ src/modules/chanmodes/topiclimit.dll \
+ src/modules/channeldb.dll \
+ src/modules/charsys.dll \
+ src/modules/chathistory.dll \
+ src/modules/chghost.dll \
+ src/modules/chgident.dll \
+ src/modules/chgname.dll \
+ src/modules/clienttagdeny.dll \
+ src/modules/close.dll \
+ src/modules/connect.dll \
+ src/modules/connthrottle.dll \
+ src/modules/cycle.dll \
+ src/modules/dccallow.dll \
+ src/modules/dccdeny.dll \
+ src/modules/echo-message.dll \
+ src/modules/eos.dll \
+ src/modules/extbans/account.dll \
+ src/modules/extbans/certfp.dll \
+ src/modules/extbans/country.dll \
+ src/modules/extbans/inchannel.dll \
+ src/modules/extbans/join.dll \
+ src/modules/extbans/msgbypass.dll \
+ src/modules/extbans/nickchange.dll \
+ src/modules/extbans/operclass.dll \
+ src/modules/extbans/partmsg.dll \
+ src/modules/extbans/quiet.dll \
+ src/modules/extbans/realname.dll \
+ src/modules/extbans/securitygroup.dll \
+ src/modules/extbans/textban.dll \
+ src/modules/extbans/timedban.dll \
+ src/modules/extended-monitor.dll \
+ src/modules/extjwt.dll \
+ src/modules/geoip_base.dll \
+ src/modules/geoip_classic.dll \
+ src/modules/geoip_csv.dll \
+ src/modules/globops.dll \
+ src/modules/help.dll \
+ src/modules/hideserver.dll \
+ src/modules/history_backend_mem.dll \
+ src/modules/history_backend_null.dll \
+ src/modules/history.dll \
+ src/modules/ident_lookup.dll \
+ src/modules/invite.dll \
+ src/modules/ircops.dll \
+ src/modules/ison.dll \
+ src/modules/join.dll \
+ src/modules/jointhrottle.dll \
+ src/modules/json-log-tag.dll \
+ src/modules/jumpserver.dll \
+ src/modules/kick.dll \
+ src/modules/kill.dll \
+ src/modules/knock.dll \
+ src/modules/labeled-response.dll \
+ src/modules/lag.dll \
+ src/modules/links.dll \
+ src/modules/link-security.dll \
+ src/modules/list.dll \
+ src/modules/locops.dll \
+ src/modules/lusers.dll \
+ src/modules/map.dll \
+ src/modules/md.dll \
+ src/modules/message.dll \
+ src/modules/message-ids.dll \
+ src/modules/message-tags.dll \
+ src/modules/mkpasswd.dll \
+ src/modules/mode.dll \
+ src/modules/monitor.dll \
+ src/modules/motd.dll \
+ src/modules/names.dll \
+ src/modules/netinfo.dll \
+ src/modules/nick.dll \
+ src/modules/nocodes.dll \
+ src/modules/cloak_md5.dll \
+ src/modules/cloak_none.dll \
+ src/modules/cloak_sha256.dll \
+ src/modules/oper.dll \
+ src/modules/operinfo.dll \
+ src/modules/opermotd.dll \
+ src/modules/part.dll \
+ src/modules/pass.dll \
+ src/modules/pingpong.dll \
+ src/modules/plaintext-policy.dll \
+ src/modules/protoctl.dll \
+ src/modules/quit.dll \
+ src/modules/reply-tag.dll \
+ src/modules/reputation.dll \
+ src/modules/require-module.dll \
+ src/modules/restrict-commands.dll \
+ src/modules/rmtkl.dll \
+ src/modules/rules.dll \
+ src/modules/sajoin.dll \
+ src/modules/samode.dll \
+ src/modules/sapart.dll \
+ src/modules/sasl.dll \
+ src/modules/sdesc.dll \
+ src/modules/sendsno.dll \
+ src/modules/sendumode.dll \
+ src/modules/server.dll \
+ src/modules/server-time.dll \
+ src/modules/sethost.dll \
+ src/modules/setident.dll \
+ src/modules/setname.dll \
+ src/modules/silence.dll \
+ src/modules/sinfo.dll \
+ src/modules/sjoin.dll \
+ src/modules/slog.dll \
+ src/modules/sqline.dll \
+ src/modules/squit.dll \
+ src/modules/staff.dll \
+ src/modules/starttls.dll \
+ src/modules/stats.dll \
+ src/modules/sts.dll \
+ src/modules/svsjoin.dll \
+ src/modules/svskill.dll \
+ src/modules/svslusers.dll \
+ src/modules/svsmode.dll \
+ src/modules/svsmotd.dll \
+ src/modules/svsnick.dll \
+ src/modules/svsnline.dll \
+ src/modules/svsnolag.dll \
+ src/modules/svsnoop.dll \
+ src/modules/svspart.dll \
+ src/modules/svssilence.dll \
+ src/modules/svssno.dll \
+ src/modules/svswatch.dll \
+ src/modules/swhois.dll \
+ src/modules/targetfloodprot.dll \
+ src/modules/time.dll \
+ src/modules/tkl.dll \
+ src/modules/tkldb.dll \
+ src/modules/tls_antidos.dll \
+ src/modules/tls_cipher.dll \
+ src/modules/topic.dll \
+ src/modules/trace.dll \
+ src/modules/tsctl.dll \
+ src/modules/typing-indicator.dll \
+ src/modules/umode2.dll \
+ src/modules/unreal_server_compat.dll \
+ src/modules/unsqline.dll \
+ src/modules/user.dll \
+ src/modules/userhost.dll \
+ src/modules/userhost-tag.dll \
+ src/modules/userip.dll \
+ src/modules/userip-tag.dll \
+ src/modules/usermodes/bot.dll \
+ src/modules/usermodes/censor.dll \
+ src/modules/usermodes/noctcp.dll \
+ src/modules/usermodes/nokick.dll \
+ src/modules/usermodes/privacy.dll \
+ src/modules/usermodes/privdeaf.dll \
+ src/modules/usermodes/regonlymsg.dll \
+ src/modules/usermodes/secureonlymsg.dll \
+ src/modules/usermodes/servicebot.dll \
+ src/modules/usermodes/showwhois.dll \
+ src/modules/usermodes/wallops.dll \
+ src/modules/vhost.dll \
+ src/modules/watch-backend.dll \
+ src/modules/watch.dll \
+ src/modules/webirc.dll \
+ src/modules/webredir.dll \
+ src/modules/websocket.dll \
+ src/modules/whois.dll \
+ src/modules/who_old.dll \
+ src/modules/whowas.dll \
+ src/modules/whox.dll
 
 
 ALL: CONF UNREALSVC.EXE UnrealIRCd.exe MODULES 
 
 CLEAN:
-        -@erase *.obj >NUL
-        -@erase src\*.obj >NUL
-        -@erase src\win.res >NUL
-        -@erase src\version.c >NUL
-        -@erase src\windows\*.obj >NUL
-	-@erase src\modules\*.obj >NUL
-	-@erase src\modules\*.lib >NUL
-	-@erase src\modules\*.pdb >NUL
-	-@erase src\modules\*.dll >NUL
-	-@erase src\modules\*.exp >NUL
-	-@erase src\modules\*.ilk >NUL
-	-@erase src\modules\chanmodes\*.obj >NUL
-	-@erase src\modules\chanmodes\*.lib >NUL
-	-@erase src\modules\chanmodes\*.pdb >NUL
-	-@erase src\modules\chanmodes\*.dll >NUL
-	-@erase src\modules\chanmodes\*.exp >NUL
-	-@erase src\modules\chanmodes\*.ilk >NUL
-	-@erase src\modules\usermodes\*.obj >NUL
-	-@erase src\modules\usermodes\*.lib >NUL
-	-@erase src\modules\usermodes\*.pdb >NUL
-	-@erase src\modules\usermodes\*.dll >NUL
-	-@erase src\modules\usermodes\*.exp >NUL
-	-@erase src\modules\usermodes\*.ilk >NUL
-	-@erase src\modules\snomasks\*.obj >NUL
-	-@erase src\modules\snomasks\*.lib >NUL
-	-@erase src\modules\snomasks\*.pdb >NUL
-	-@erase src\modules\snomasks\*.dll >NUL
-	-@erase src\modules\snomasks\*.exp >NUL
-	-@erase src\modules\snomasks\*.ilk >NUL
-	-@erase src\modules\extbans\*.obj >NUL
-	-@erase src\modules\extbans\*.lib >NUL
-	-@erase src\modules\extbans\*.pdb >NUL
-	-@erase src\modules\extbans\*.dll >NUL
-	-@erase src\modules\extbans\*.exp >NUL
-	-@erase src\modules\extbans\*.ilk >NUL
-        -@erase .\*.exe >NUL
-	-@erase UnrealIRCd.lib >NUL
-
-./UNREALSVC.EXE: SRC/UNREALSVC.OBJ SRC/WINDOWS/UNREALSVC.RES
+	-@del /Q /S *.dll *.exe *.obj *.pdb *.res *.lib  *.exp *.ilk src\version.c >NUL
+
+UNREALSVC.EXE: SRC/UNREALSVC.OBJ SRC/WINDOWS/UNREALSVC.RES
 	$(LINK) $(DBGLFLAGST) advapi32.lib src/unrealsvc.obj src/windows/unrealsvc.res
 
 CONF:
@@ -361,9 +424,7 @@ CONF:
 	$(CC) src/windows/config.c
 	-@config.exe
 
-
-
-./UnrealIRCd.exe: $(OBJ_FILES) src/windows/win.res
+UnrealIRCd.exe: $(OBJ_FILES) src/windows/win.res
         $(LINK) $(LFLAGS) $(OBJ_FILES) src/windows/win.res /MAP
 	-@erase src\windows\win.res
 	$(MT) -manifest src\windows\UnrealIRCd.exe.manifest -outputresource:UnrealIRCd.exe;1
@@ -430,9 +491,6 @@ src/conf_preprocessor.obj: src/conf_preprocessor.c $(INCLUDES)
 src/debug.obj: src/debug.c $(INCLUDES)
         $(CC) $(CFLAGS) src/debug.c
 
-src/numeric.obj: src/numeric.c $(INCLUDES)
-        $(CC) $(CFLAGS) src/numeric.c
-
 src/misc.obj: src/misc.c $(INCLUDES) ./include/dbuf.h
         $(CC) $(CFLAGS) src/misc.c
 
@@ -509,8 +567,8 @@ src/mempool.obj: src/mempool.c $(INCLUDES)
 src/dispatch.obj: src/dispatch.c $(INCLUDES)
 	$(CC) $(CFLAGS) src/dispatch.c
 
-src/url.obj: src/url.c $(INCLUDES) ./include/url.h
-	$(CC) $(CFLAGS) src/url.c
+src/url_curl.obj: src/url_curl.c $(INCLUDES)
+	$(CC) $(CFLAGS) src/url_curl.c
 
 src/api-extban.obj: src/api-extban.c $(INCLUDES)
 	$(CC) $(CFLAGS) src/api-extban.c
@@ -542,9 +600,6 @@ src/crypt_blowfish.obj: src/crypt_blowfish.c $(INCLUDES)
 src/operclass.obj: src/operclass.c $(INCLUDES) ./include/dbuf.h
         $(CC) $(CFLAGS) src/operclass.c
 
-src/updconf.obj: src/updconf.c $(INCLUDES) ./include/dbuf.h
-        $(CC) $(CFLAGS) src/updconf.c
-
 src/crashreport.obj: src/crashreport.c $(INCLUDES) ./include/dbuf.h
         $(CC) $(CFLAGS) src/crashreport.c
 
@@ -554,6 +609,12 @@ src/unrealdb.obj: src/unrealdb.c $(INCLUDES) ./include/dbuf.h
 src/utf8.obj: src/utf8.c $(INCLUDES) ./include/dbuf.h
         $(CC) $(CFLAGS) src/utf8.c
 
+src/openssl_hostname_validation.obj: src/openssl_hostname_validation.c $(INCLUDES) ./include/dbuf.h
+        $(CC) $(CFLAGS) src/openssl_hostname_validation.c
+
+src/log.obj: src/log.c $(INCLUDES) ./include/dbuf.h
+        $(CC) $(CFLAGS) src/log.c
+
 src/windows/win.res: src/windows/wingui.rc
         $(RC) /l 0x409 /fosrc/windows/win.res /i ./include /i ./src \
               /d NDEBUG src/windows/wingui.rc
@@ -575,556 +636,642 @@ SYMBOLFILE:
 
 MODULES: $(DLL_FILES)
 
-src/modules/cloak.dll: src/modules/cloak.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/cloak.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/account-notify.dll: src/modules/account-notify.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/account-notify.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/account-notify.pdb $(MODLFLAGS)
 
-src/modules/chghost.dll: src/modules/chghost.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/chghost.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/account-tag.dll: src/modules/account-tag.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/account-tag.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/account-tag.pdb $(MODLFLAGS)
 
-src/modules/chgident.dll: src/modules/chgident.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/chgident.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/addmotd.dll: src/modules/addmotd.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/addmotd.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/addmotd.pdb $(MODLFLAGS)
 
-src/modules/sdesc.dll: src/modules/sdesc.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/sdesc.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/addomotd.dll: src/modules/addomotd.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/addomotd.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/addomotd.pdb $(MODLFLAGS)
 
-src/modules/sethost.dll: src/modules/sethost.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/sethost.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/admin.dll: src/modules/admin.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/admin.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/admin.pdb $(MODLFLAGS)
 
-src/modules/setident.dll: src/modules/setident.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/setident.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/antimixedutf8.dll: src/modules/antimixedutf8.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/antimixedutf8.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/antimixedutf8.pdb $(MODLFLAGS)
 
-src/modules/setname.dll: src/modules/setname.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/setname.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/antirandom.dll: src/modules/antirandom.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/antirandom.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/antirandom.pdb $(MODLFLAGS)
 
-src/modules/svsmotd.dll: src/modules/svsmotd.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/svsmotd.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/authprompt.dll: src/modules/authprompt.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/authprompt.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/authprompt.pdb $(MODLFLAGS)
 
-src/modules/svsmode.dll: src/modules/svsmode.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/svsmode.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/away.dll: src/modules/away.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/away.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/away.pdb $(MODLFLAGS)
 
-src/modules/tkl.dll: src/modules/tkl.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/tkl.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/batch.dll: src/modules/batch.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/batch.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/batch.pdb $(MODLFLAGS)
 
-src/modules/swhois.dll: src/modules/swhois.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/swhois.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/blacklist.dll: src/modules/blacklist.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/blacklist.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/blacklist.pdb $(MODLFLAGS)
 
-src/modules/svsnline.dll: src/modules/svsnline.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/svsnline.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/botmotd.dll: src/modules/botmotd.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/botmotd.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/botmotd.pdb $(MODLFLAGS)
 
-src/modules/who_old.dll: src/modules/who_old.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/who_old.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/bot-tag.dll: src/modules/bot-tag.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/bot-tag.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/bot-tag.pdb $(MODLFLAGS)
 
-src/modules/whox.dll: src/modules/whox.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/whox.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/cap.dll: src/modules/cap.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/cap.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/cap.pdb $(MODLFLAGS)
 
-src/modules/away.dll: src/modules/away.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/away.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/certfp.dll: src/modules/certfp.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/certfp.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/certfp.pdb $(MODLFLAGS)
 
-src/modules/mkpasswd.dll: src/modules/mkpasswd.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/mkpasswd.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chanmodes/chanowner.dll: src/modules/chanmodes/chanowner.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chanmodes/chanowner.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/chanowner.pdb $(MODLFLAGS)
 
-src/modules/svsnoop.dll: src/modules/svsnoop.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/svsnoop.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chanmodes/chanadmin.dll: src/modules/chanmodes/chanadmin.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chanmodes/chanadmin.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/chanadmin.pdb $(MODLFLAGS)
 
-src/modules/svsnick.dll: src/modules/svsnick.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/svsnick.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chanmodes/chanop.dll: src/modules/chanmodes/chanop.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chanmodes/chanop.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/chanop.pdb $(MODLFLAGS)
 
-src/modules/chgname.dll: src/modules/chgname.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/chgname.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chanmodes/halfop.dll: src/modules/chanmodes/halfop.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chanmodes/halfop.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/halfop.pdb $(MODLFLAGS)
 
-src/modules/kill.dll: src/modules/kill.c $(INCLUDES) 
-	$(CC) $(MODCFLAGS) src/modules/kill.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chanmodes/voice.dll: src/modules/chanmodes/voice.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chanmodes/voice.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/voice.pdb $(MODLFLAGS)
 
-src/modules/lag.dll: src/modules/lag.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/lag.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chanmodes/censor.dll: src/modules/chanmodes/censor.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chanmodes/censor.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/censor.pdb $(MODLFLAGS)
 
-src/modules/message.dll: src/modules/message.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/message.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chanmodes/delayjoin.dll: src/modules/chanmodes/delayjoin.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chanmodes/delayjoin.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/delayjoin.pdb $(MODLFLAGS)
 
-src/modules/oper.dll: src/modules/oper.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/oper.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chanmodes/floodprot.dll: src/modules/chanmodes/floodprot.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chanmodes/floodprot.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/floodprot.pdb $(MODLFLAGS)
 
-src/modules/pingpong.dll: src/modules/pingpong.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/pingpong.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chanmodes/history.dll: src/modules/chanmodes/history.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chanmodes/history.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/history.pdb $(MODLFLAGS)
 
-src/modules/quit.dll: src/modules/quit.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/quit.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chanmodes/inviteonly.dll: src/modules/chanmodes/inviteonly.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chanmodes/inviteonly.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/inviteonly.pdb $(MODLFLAGS)
 
-src/modules/sendumode.dll: src/modules/sendumode.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/sendumode.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chanmodes/isregistered.dll: src/modules/chanmodes/isregistered.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chanmodes/isregistered.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/isregistered.pdb $(MODLFLAGS)
 
-src/modules/sqline.dll: src/modules/sqline.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/sqline.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chanmodes/issecure.dll: src/modules/chanmodes/issecure.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chanmodes/issecure.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/issecure.pdb $(MODLFLAGS)
 
-src/modules/tsctl.dll: src/modules/tsctl.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/tsctl.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chanmodes/key.dll: src/modules/chanmodes/key.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chanmodes/key.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/key.pdb $(MODLFLAGS)
 
-src/modules/unsqline.dll: src/modules/unsqline.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/unsqline.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chanmodes/limit.dll: src/modules/chanmodes/limit.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chanmodes/limit.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/limit.pdb $(MODLFLAGS)
 
-src/modules/whois.dll: src/modules/whois.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/whois.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chanmodes/link.dll: src/modules/chanmodes/link.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chanmodes/link.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/link.pdb $(MODLFLAGS)
 
-src/modules/vhost.dll: src/modules/vhost.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/vhost.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chanmodes/moderated.dll: src/modules/chanmodes/moderated.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chanmodes/moderated.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/moderated.pdb $(MODLFLAGS)
 
-src/modules/cycle.dll: src/modules/cycle.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/cycle.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chanmodes/nocolor.dll: src/modules/chanmodes/nocolor.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chanmodes/nocolor.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/nocolor.pdb $(MODLFLAGS)
 
-src/modules/svsjoin.dll: src/modules/svsjoin.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/svsjoin.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chanmodes/noctcp.dll: src/modules/chanmodes/noctcp.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chanmodes/noctcp.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/noctcp.pdb $(MODLFLAGS)
 
-src/modules/svspart.dll: src/modules/svspart.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/svspart.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chanmodes/noexternalmsgs.dll: src/modules/chanmodes/noexternalmsgs.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chanmodes/noexternalmsgs.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/noexternalmsgs.pdb $(MODLFLAGS)
 
-src/modules/svslusers.dll: src/modules/svslusers.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/svslusers.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chanmodes/noinvite.dll: src/modules/chanmodes/noinvite.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chanmodes/noinvite.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/noinvite.pdb $(MODLFLAGS)
 
-src/modules/svswatch.dll: src/modules/svswatch.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/svswatch.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chanmodes/nokick.dll: src/modules/chanmodes/nokick.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chanmodes/nokick.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/nokick.pdb $(MODLFLAGS)
 
-src/modules/svssilence.dll: src/modules/svssilence.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/svssilence.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chanmodes/noknock.dll: src/modules/chanmodes/noknock.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chanmodes/noknock.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/noknock.pdb $(MODLFLAGS)
 
-src/modules/sendsno.dll: src/modules/sendsno.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/sendsno.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chanmodes/nonickchange.dll: src/modules/chanmodes/nonickchange.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chanmodes/nonickchange.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/nonickchange.pdb $(MODLFLAGS)
 
-src/modules/svssno.dll: src/modules/svssno.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/svssno.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chanmodes/nonotice.dll: src/modules/chanmodes/nonotice.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chanmodes/nonotice.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/nonotice.pdb $(MODLFLAGS)
 
-src/modules/sajoin.dll: src/modules/sajoin.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/sajoin.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chanmodes/operonly.dll: src/modules/chanmodes/operonly.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chanmodes/operonly.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/operonly.pdb $(MODLFLAGS)
 
-src/modules/sapart.dll: src/modules/sapart.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/sapart.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chanmodes/permanent.dll: src/modules/chanmodes/permanent.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chanmodes/permanent.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/permanent.pdb $(MODLFLAGS)
 
-src/modules/samode.dll: src/modules/samode.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/samode.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chanmodes/private.dll: src/modules/chanmodes/private.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chanmodes/private.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/private.pdb $(MODLFLAGS)
 
-src/modules/kick.dll: src/modules/kick.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/kick.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chanmodes/regonly.dll: src/modules/chanmodes/regonly.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chanmodes/regonly.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/regonly.pdb $(MODLFLAGS)
 
-src/modules/topic.dll: src/modules/topic.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/topic.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chanmodes/regonlyspeak.dll: src/modules/chanmodes/regonlyspeak.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chanmodes/regonlyspeak.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/regonlyspeak.pdb $(MODLFLAGS)
 
-src/modules/invite.dll: src/modules/invite.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/invite.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chanmodes/secret.dll: src/modules/chanmodes/secret.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chanmodes/secret.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/secret.pdb $(MODLFLAGS)
 
-src/modules/list.dll: src/modules/list.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/list.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chanmodes/secureonly.dll: src/modules/chanmodes/secureonly.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chanmodes/secureonly.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/secureonly.pdb $(MODLFLAGS)
 
-src/modules/time.dll: src/modules/time.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/time.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chanmodes/stripcolor.dll: src/modules/chanmodes/stripcolor.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chanmodes/stripcolor.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/stripcolor.pdb $(MODLFLAGS)
 
-src/modules/svskill.dll: src/modules/svskill.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/svskill.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chanmodes/topiclimit.dll: src/modules/chanmodes/topiclimit.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chanmodes/topiclimit.c /Fesrc/modules/chanmodes/ /Fosrc/modules/chanmodes/ /Fdsrc/modules/chanmodes/topiclimit.pdb $(MODLFLAGS)
 
-src/modules/sjoin.dll: src/modules/sjoin.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/sjoin.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/channeldb.dll: src/modules/channeldb.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/channeldb.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/channeldb.pdb $(MODLFLAGS)
 
-src/modules/pass.dll: src/modules/pass.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/pass.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/charsys.dll: src/modules/charsys.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/charsys.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/charsys.pdb $(MODLFLAGS)
 
-src/modules/userhost.dll: src/modules/userhost.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/userhost.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chathistory.dll: src/modules/chathistory.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chathistory.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/chathistory.pdb $(MODLFLAGS)
 
-src/modules/ison.dll: src/modules/ison.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/ison.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chghost.dll: src/modules/chghost.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chghost.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/chghost.pdb $(MODLFLAGS)
 
-src/modules/silence.dll: src/modules/silence.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/silence.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chgident.dll: src/modules/chgident.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chgident.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/chgident.pdb $(MODLFLAGS)
 
-src/modules/knock.dll: src/modules/knock.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/knock.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/chgname.dll: src/modules/chgname.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/chgname.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/chgname.pdb $(MODLFLAGS)
 
-src/modules/umode2.dll: src/modules/umode2.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/umode2.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/clienttagdeny.dll: src/modules/clienttagdeny.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/clienttagdeny.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/clienttagdeny.pdb $(MODLFLAGS)
 
-src/modules/squit.dll: src/modules/squit.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/squit.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/close.dll: src/modules/close.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/close.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/close.pdb $(MODLFLAGS)
 
-src/modules/protoctl.dll: src/modules/protoctl.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/protoctl.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/connect.dll: src/modules/connect.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/connect.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/connect.pdb $(MODLFLAGS)
 
-src/modules/addmotd.dll: src/modules/addmotd.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/addmotd.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/connthrottle.dll: src/modules/connthrottle.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/connthrottle.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/connthrottle.pdb $(MODLFLAGS)
 
-src/modules/addomotd.dll: src/modules/addomotd.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/addomotd.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/cycle.dll: src/modules/cycle.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/cycle.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/cycle.pdb $(MODLFLAGS)
 
-src/modules/wallops.dll: src/modules/wallops.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/wallops.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/dccallow.dll: src/modules/dccallow.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/dccallow.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/dccallow.pdb $(MODLFLAGS)
 
-src/modules/admin.dll: src/modules/admin.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/admin.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/dccdeny.dll: src/modules/dccdeny.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/dccdeny.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/dccdeny.pdb $(MODLFLAGS)
 
-src/modules/globops.dll: src/modules/globops.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/globops.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/echo-message.dll: src/modules/echo-message.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/echo-message.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/echo-message.pdb $(MODLFLAGS)
 
-src/modules/locops.dll: src/modules/locops.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/locops.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/eos.dll: src/modules/eos.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/eos.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/eos.pdb $(MODLFLAGS)
 
-src/modules/trace.dll: src/modules/trace.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/trace.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/extbans/account.dll: src/modules/extbans/account.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/extbans/account.c /Fesrc/modules/extbans/ /Fosrc/modules/extbans/ /Fdsrc/modules/extbans/account.pdb $(MODLFLAGS)
 
-src/modules/netinfo.dll: src/modules/netinfo.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/netinfo.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/extbans/certfp.dll: src/modules/extbans/certfp.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/extbans/certfp.c /Fesrc/modules/extbans/ /Fosrc/modules/extbans/ /Fdsrc/modules/extbans/certfp.pdb $(MODLFLAGS)
 
-src/modules/links.dll: src/modules/links.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/links.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/extbans/country.dll: src/modules/extbans/country.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/extbans/country.c /Fesrc/modules/extbans/ /Fosrc/modules/extbans/ /Fdsrc/modules/extbans/country.pdb $(MODLFLAGS)
 
-src/modules/help.dll: src/modules/help.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/help.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/extbans/inchannel.dll: src/modules/extbans/inchannel.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/extbans/inchannel.c /Fesrc/modules/extbans/ /Fosrc/modules/extbans/ /Fdsrc/modules/extbans/inchannel.pdb $(MODLFLAGS)
 
-src/modules/rules.dll: src/modules/rules.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/rules.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
- 
-src/modules/close.dll: src/modules/close.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/close.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/extbans/join.dll: src/modules/extbans/join.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/extbans/join.c /Fesrc/modules/extbans/ /Fosrc/modules/extbans/ /Fdsrc/modules/extbans/join.pdb $(MODLFLAGS)
 
-src/modules/map.dll: src/modules/map.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/map.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/extbans/msgbypass.dll: src/modules/extbans/msgbypass.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/extbans/msgbypass.c /Fesrc/modules/extbans/ /Fosrc/modules/extbans/ /Fdsrc/modules/extbans/msgbypass.pdb $(MODLFLAGS)
 
-src/modules/eos.dll: src/modules/eos.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/eos.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/extbans/nickchange.dll: src/modules/extbans/nickchange.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/extbans/nickchange.c /Fesrc/modules/extbans/ /Fosrc/modules/extbans/ /Fdsrc/modules/extbans/nickchange.pdb $(MODLFLAGS)
 
-src/modules/server.dll: src/modules/server.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/server.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/extbans/operclass.dll: src/modules/extbans/operclass.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/extbans/operclass.c /Fesrc/modules/extbans/ /Fosrc/modules/extbans/ /Fdsrc/modules/extbans/operclass.pdb $(MODLFLAGS)
 
-src/modules/stats.dll: src/modules/stats.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/stats.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/extbans/partmsg.dll: src/modules/extbans/partmsg.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/extbans/partmsg.c /Fesrc/modules/extbans/ /Fosrc/modules/extbans/ /Fdsrc/modules/extbans/partmsg.pdb $(MODLFLAGS)
 
-src/modules/dccdeny.dll: src/modules/dccdeny.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/dccdeny.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/extbans/quiet.dll: src/modules/extbans/quiet.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/extbans/quiet.c /Fesrc/modules/extbans/ /Fosrc/modules/extbans/ /Fdsrc/modules/extbans/quiet.pdb $(MODLFLAGS)
 
-src/modules/whowas.dll: src/modules/whowas.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/whowas.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/extbans/realname.dll: src/modules/extbans/realname.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/extbans/realname.c /Fesrc/modules/extbans/ /Fosrc/modules/extbans/ /Fdsrc/modules/extbans/realname.pdb $(MODLFLAGS)
 
-src/modules/connect.dll: src/modules/connect.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/connect.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/extbans/securitygroup.dll: src/modules/extbans/securitygroup.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/extbans/securitygroup.c /Fesrc/modules/extbans/ /Fosrc/modules/extbans/ /Fdsrc/modules/extbans/securitygroup.pdb $(MODLFLAGS)
 
-src/modules/dccallow.dll: src/modules/dccallow.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/dccallow.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/extbans/textban.dll: src/modules/extbans/textban.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/extbans/textban.c /Fesrc/modules/extbans/ /Fosrc/modules/extbans/ /Fdsrc/modules/extbans/textban.pdb $(MODLFLAGS)
 
-src/modules/userip.dll: src/modules/userip.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/userip.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/extbans/timedban.dll: src/modules/extbans/timedban.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/extbans/timedban.c /Fesrc/modules/extbans/ /Fosrc/modules/extbans/ /Fdsrc/modules/extbans/timedban.pdb $(MODLFLAGS)
 
-src/modules/nick.dll: src/modules/nick.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/nick.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/extended-monitor.dll: src/modules/extended-monitor.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/extended-monitor.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/extended-monitor.pdb $(MODLFLAGS)
 
-src/modules/user.dll: src/modules/user.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/user.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/geoip_base.dll: src/modules/geoip_base.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/geoip_base.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/geoip_base.pdb $(MODLFLAGS)
 
-src/modules/mode.dll: src/modules/mode.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/mode.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/extjwt.dll: src/modules/extjwt.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/extjwt.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/extjwt.pdb $(MODLFLAGS)
 
-src/modules/watch.dll: src/modules/watch.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/watch.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/geoip_classic.dll: src/modules/geoip_classic.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) /I "$(GEOIPCLASSIC_INC_DIR)" src/modules/geoip_classic.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/geoip_classic.pdb $(MODLFLAGS) /LIBPATH:"$(GEOIPCLASSIC_LIB_DIR)" $(GEOIPCLASSICLIB)
 
-src/modules/part.dll: src/modules/part.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/part.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/geoip_csv.dll: src/modules/geoip_csv.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/geoip_csv.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/geoip_csv.pdb $(MODLFLAGS)
+
+src/modules/geoip_maxmind.dll: src/modules/geoip_maxmind.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/geoip_maxmind.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/geoip_maxmind.pdb $(MODLFLAGS)
+
+src/modules/globops.dll: src/modules/globops.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/globops.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/globops.pdb $(MODLFLAGS)
+
+src/modules/help.dll: src/modules/help.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/help.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/help.pdb $(MODLFLAGS)
+
+src/modules/hideserver.dll: src/modules/hideserver.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/hideserver.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/hideserver.pdb $(MODLFLAGS)
+
+src/modules/history_backend_mem.dll: src/modules/history_backend_mem.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/history_backend_mem.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/history_backend_mem.pdb $(MODLFLAGS)
+
+src/modules/history_backend_null.dll: src/modules/history_backend_null.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/history_backend_null.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/history_backend_null.pdb $(MODLFLAGS)
+
+src/modules/history.dll: src/modules/history.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/history.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/history.pdb $(MODLFLAGS)
+
+src/modules/ident_lookup.dll: src/modules/ident_lookup.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/ident_lookup.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/ident_lookup.pdb $(MODLFLAGS)
+
+src/modules/invite.dll: src/modules/invite.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/invite.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/invite.pdb $(MODLFLAGS)
+
+src/modules/ircops.dll: src/modules/ircops.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/ircops.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/ircops.pdb $(MODLFLAGS)
+
+src/modules/ison.dll: src/modules/ison.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/ison.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/ison.pdb $(MODLFLAGS)
 
 src/modules/join.dll: src/modules/join.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/join.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+	$(CC) $(MODCFLAGS) src/modules/join.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/join.pdb $(MODLFLAGS)
 
-src/modules/motd.dll: src/modules/motd.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/motd.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/jointhrottle.dll: src/modules/jointhrottle.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/jointhrottle.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/jointhrottle.pdb $(MODLFLAGS)
 
-src/modules/opermotd.dll: src/modules/opermotd.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/opermotd.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/json-log-tag.dll: src/modules/json-log-tag.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/json-log-tag.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/json-log-tag.pdb $(MODLFLAGS)
 
-src/modules/botmotd.dll: src/modules/botmotd.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/botmotd.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/jumpserver.dll: src/modules/jumpserver.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/jumpserver.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/jumpserver.pdb $(MODLFLAGS)
+
+src/modules/kick.dll: src/modules/kick.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/kick.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/kick.pdb $(MODLFLAGS)
+
+src/modules/kill.dll: src/modules/kill.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/kill.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/kill.pdb $(MODLFLAGS)
+
+src/modules/knock.dll: src/modules/knock.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/knock.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/knock.pdb $(MODLFLAGS)
+
+src/modules/labeled-response.dll: src/modules/labeled-response.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/labeled-response.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/labeled-response.pdb $(MODLFLAGS)
+
+src/modules/lag.dll: src/modules/lag.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/lag.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/lag.pdb $(MODLFLAGS)
+
+src/modules/links.dll: src/modules/links.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/links.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/links.pdb $(MODLFLAGS)
+
+src/modules/link-security.dll: src/modules/link-security.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/link-security.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/link-security.pdb $(MODLFLAGS)
+
+src/modules/list.dll: src/modules/list.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/list.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/list.pdb $(MODLFLAGS)
+
+src/modules/locops.dll: src/modules/locops.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/locops.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/locops.pdb $(MODLFLAGS)
 
 src/modules/lusers.dll: src/modules/lusers.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/lusers.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+	$(CC) $(MODCFLAGS) src/modules/lusers.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/lusers.pdb $(MODLFLAGS)
 
-src/modules/names.dll: src/modules/names.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/names.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/map.dll: src/modules/map.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/map.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/map.pdb $(MODLFLAGS)
 
 src/modules/md.dll: src/modules/md.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/md.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+	$(CC) $(MODCFLAGS) src/modules/md.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/md.pdb $(MODLFLAGS)
 
-src/modules/certfp.dll: src/modules/certfp.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/certfp.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/message.dll: src/modules/message.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/message.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/message.pdb $(MODLFLAGS)
 
-src/modules/webirc.dll: src/modules/webirc.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/webirc.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/message-ids.dll: src/modules/message-ids.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/message-ids.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/message-ids.pdb $(MODLFLAGS)
 
-src/modules/websocket.dll: src/modules/websocket.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/websocket.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/message-tags.dll: src/modules/message-tags.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/message-tags.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/message-tags.pdb $(MODLFLAGS)
 
-src/modules/blacklist.dll: src/modules/blacklist.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/blacklist.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/mkpasswd.dll: src/modules/mkpasswd.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/mkpasswd.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/mkpasswd.pdb $(MODLFLAGS)
 
-src/modules/jointhrottle.dll: src/modules/jointhrottle.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/jointhrottle.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/mode.dll: src/modules/mode.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/mode.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/mode.pdb $(MODLFLAGS)
 
-src/modules/svsnolag.dll: src/modules/svsnolag.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/svsnolag.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/monitor.dll: src/modules/monitor.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/monitor.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/monitor.pdb $(MODLFLAGS)
 
-src/modules/starttls.dll: src/modules/starttls.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/starttls.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/motd.dll: src/modules/motd.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/motd.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/motd.pdb $(MODLFLAGS)
 
-src/modules/webredir.dll: src/modules/webredir.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/webredir.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/names.dll: src/modules/names.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/names.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/names.pdb $(MODLFLAGS)
 
-src/modules/cap.dll: src/modules/cap.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/cap.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/netinfo.dll: src/modules/netinfo.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/netinfo.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/netinfo.pdb $(MODLFLAGS)
 
-src/modules/sasl.dll: src/modules/sasl.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/sasl.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/nick.dll: src/modules/nick.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/nick.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/nick.pdb $(MODLFLAGS)
 
-src/modules/tls_antidos.dll: src/modules/tls_antidos.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) src/modules/tls_antidos.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/nocodes.dll: src/modules/nocodes.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/nocodes.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/nocodes.pdb $(MODLFLAGS)
 
-src/modules/antirandom.dll: src/modules/antirandom.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/antirandom.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/cloak_md5.dll: src/modules/cloak_md5.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/cloak_md5.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/cloak_md5.pdb $(MODLFLAGS)
 
-src/modules/hideserver.dll: src/modules/hideserver.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/hideserver.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/cloak_none.dll: src/modules/cloak_none.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/cloak_none.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/cloak_none.pdb $(MODLFLAGS)
 
-src/modules/jumpserver.dll: src/modules/jumpserver.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/jumpserver.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/cloak_sha256.dll: src/modules/cloak_sha256.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/cloak_sha256.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/cloak_sha256.pdb $(MODLFLAGS)
 
-src/modules/ircops.dll: src/modules/ircops.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/ircops.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/oper.dll: src/modules/oper.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/oper.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/oper.pdb $(MODLFLAGS)
 
-src/modules/staff.dll: src/modules/staff.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/staff.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/operinfo.dll: src/modules/operinfo.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/operinfo.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/operinfo.pdb $(MODLFLAGS)
 
-src/modules/nocodes.dll: src/modules/nocodes.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/nocodes.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/opermotd.dll: src/modules/opermotd.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/opermotd.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/opermotd.pdb $(MODLFLAGS)
 
-src/modules/charsys.dll: src/modules/charsys.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/charsys.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/part.dll: src/modules/part.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/part.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/part.pdb $(MODLFLAGS)
 
-src/modules/antimixedutf8.dll: src/modules/antimixedutf8.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/antimixedutf8.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/pass.dll: src/modules/pass.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/pass.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/pass.pdb $(MODLFLAGS)
 
-src/modules/authprompt.dll: src/modules/authprompt.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/authprompt.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/pingpong.dll: src/modules/pingpong.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/pingpong.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/pingpong.pdb $(MODLFLAGS)
 
-src/modules/sinfo.dll: src/modules/sinfo.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/sinfo.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/plaintext-policy.dll: src/modules/plaintext-policy.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/plaintext-policy.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/plaintext-policy.pdb $(MODLFLAGS)
+
+src/modules/protoctl.dll: src/modules/protoctl.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/protoctl.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/protoctl.pdb $(MODLFLAGS)
+
+src/modules/quit.dll: src/modules/quit.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/quit.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/quit.pdb $(MODLFLAGS)
+
+src/modules/reply-tag.dll: src/modules/reply-tag.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/reply-tag.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/reply-tag.pdb $(MODLFLAGS)
 
 src/modules/reputation.dll: src/modules/reputation.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/reputation.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+	$(CC) $(MODCFLAGS) src/modules/reputation.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/reputation.pdb $(MODLFLAGS)
 
-src/modules/connthrottle.dll: src/modules/connthrottle.c $(INCLUDES)
-        $(CC) $(MODCFLAGS) src/modules/connthrottle.c /Fesrc/modules/ /Fosrc/modules/ $(MODLFLAGS)
+src/modules/require-module.dll: src/modules/require-module.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/require-module.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/require-module.pdb $(MODLFLAGS)
 
-src/modules/chanmodes/censor.dll: src/modules/chanmodes/censor.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/censor.c $(MODLFLAGS)
+src/modules/restrict-commands.dll: src/modules/restrict-commands.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/restrict-commands.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/restrict-commands.pdb $(MODLFLAGS)
 
-src/modules/chanmodes/delayjoin.dll: src/modules/chanmodes/delayjoin.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/delayjoin.c $(MODLFLAGS)
+src/modules/rmtkl.dll: src/modules/rmtkl.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/rmtkl.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/rmtkl.pdb $(MODLFLAGS)
 
-src/modules/chanmodes/floodprot.dll: src/modules/chanmodes/floodprot.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/floodprot.c $(MODLFLAGS)
+src/modules/rules.dll: src/modules/rules.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/rules.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/rules.pdb $(MODLFLAGS)
 
-src/modules/chanmodes/issecure.dll: src/modules/chanmodes/issecure.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/issecure.c $(MODLFLAGS)
+src/modules/sajoin.dll: src/modules/sajoin.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/sajoin.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/sajoin.pdb $(MODLFLAGS)
 
-src/modules/chanmodes/link.dll: src/modules/chanmodes/link.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/link.c $(MODLFLAGS)
+src/modules/samode.dll: src/modules/samode.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/samode.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/samode.pdb $(MODLFLAGS)
 
-src/modules/chanmodes/nocolor.dll: src/modules/chanmodes/nocolor.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/nocolor.c $(MODLFLAGS)
+src/modules/sapart.dll: src/modules/sapart.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/sapart.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/sapart.pdb $(MODLFLAGS)
 
-src/modules/chanmodes/noctcp.dll: src/modules/chanmodes/noctcp.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/noctcp.c $(MODLFLAGS)
+src/modules/sasl.dll: src/modules/sasl.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/sasl.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/sasl.pdb $(MODLFLAGS)
 
-src/modules/chanmodes/noinvite.dll: src/modules/chanmodes/noinvite.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/noinvite.c $(MODLFLAGS)
+src/modules/sdesc.dll: src/modules/sdesc.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/sdesc.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/sdesc.pdb $(MODLFLAGS)
 
-src/modules/chanmodes/nokick.dll: src/modules/chanmodes/nokick.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/nokick.c $(MODLFLAGS)
+src/modules/sendsno.dll: src/modules/sendsno.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/sendsno.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/sendsno.pdb $(MODLFLAGS)
 
-src/modules/chanmodes/noknock.dll: src/modules/chanmodes/noknock.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/noknock.c $(MODLFLAGS)
+src/modules/sendumode.dll: src/modules/sendumode.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/sendumode.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/sendumode.pdb $(MODLFLAGS)
 
-src/modules/chanmodes/nonickchange.dll: src/modules/chanmodes/nonickchange.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/nonickchange.c $(MODLFLAGS)
+src/modules/server.dll: src/modules/server.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/server.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/server.pdb $(MODLFLAGS)
 
-src/modules/chanmodes/nonotice.dll: src/modules/chanmodes/nonotice.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/nonotice.c $(MODLFLAGS)
+src/modules/server-time.dll: src/modules/server-time.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/server-time.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/server-time.pdb $(MODLFLAGS)
 
-src/modules/chanmodes/operonly.dll: src/modules/chanmodes/operonly.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/operonly.c $(MODLFLAGS)
+src/modules/sethost.dll: src/modules/sethost.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/sethost.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/sethost.pdb $(MODLFLAGS)
 
-src/modules/chanmodes/permanent.dll: src/modules/chanmodes/permanent.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/permanent.c $(MODLFLAGS)
+src/modules/setident.dll: src/modules/setident.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/setident.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/setident.pdb $(MODLFLAGS)
 
-src/modules/chanmodes/regonly.dll: src/modules/chanmodes/regonly.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/regonly.c $(MODLFLAGS)
+src/modules/setname.dll: src/modules/setname.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/setname.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/setname.pdb $(MODLFLAGS)
 
-src/modules/chanmodes/regonlyspeak.dll: src/modules/chanmodes/regonlyspeak.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/regonlyspeak.c $(MODLFLAGS)
+src/modules/silence.dll: src/modules/silence.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/silence.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/silence.pdb $(MODLFLAGS)
 
-src/modules/chanmodes/secureonly.dll: src/modules/chanmodes/secureonly.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/secureonly.c $(MODLFLAGS)
+src/modules/sinfo.dll: src/modules/sinfo.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/sinfo.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/sinfo.pdb $(MODLFLAGS)
 
-src/modules/chanmodes/stripcolor.dll: src/modules/chanmodes/stripcolor.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/stripcolor.c $(MODLFLAGS)
+src/modules/sjoin.dll: src/modules/sjoin.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/sjoin.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/sjoin.pdb $(MODLFLAGS)
 
-src/modules/chanmodes/history.dll: src/modules/chanmodes/history.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/chanmodes/ /Fesrc/modules/chanmodes/ src/modules/chanmodes/history.c $(MODLFLAGS)
+src/modules/slog.dll: src/modules/slog.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/slog.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/slog.pdb $(MODLFLAGS)
 
-src/modules/usermodes/censor.dll: src/modules/usermodes/censor.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/usermodes/ /Fesrc/modules/usermodes/ src/modules/usermodes/censor.c $(MODLFLAGS)
+src/modules/sqline.dll: src/modules/sqline.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/sqline.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/sqline.pdb $(MODLFLAGS)
 
-src/modules/usermodes/noctcp.dll: src/modules/usermodes/noctcp.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/usermodes/ /Fesrc/modules/usermodes/ src/modules/usermodes/noctcp.c $(MODLFLAGS)
+src/modules/squit.dll: src/modules/squit.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/squit.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/squit.pdb $(MODLFLAGS)
 
-src/modules/usermodes/bot.dll: src/modules/usermodes/bot.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/usermodes/ /Fesrc/modules/usermodes/ src/modules/usermodes/bot.c $(MODLFLAGS)
+src/modules/staff.dll: src/modules/staff.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/staff.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/staff.pdb $(MODLFLAGS)
 
-src/modules/usermodes/servicebot.dll: src/modules/usermodes/servicebot.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/usermodes/ /Fesrc/modules/usermodes/ src/modules/usermodes/servicebot.c $(MODLFLAGS)
+src/modules/starttls.dll: src/modules/starttls.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/starttls.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/starttls.pdb $(MODLFLAGS)
 
-src/modules/usermodes/showwhois.dll: src/modules/usermodes/showwhois.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/usermodes/ /Fesrc/modules/usermodes/ src/modules/usermodes/showwhois.c $(MODLFLAGS)
+src/modules/stats.dll: src/modules/stats.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/stats.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/stats.pdb $(MODLFLAGS)
 
-src/modules/usermodes/privacy.dll: src/modules/usermodes/privacy.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/usermodes/ /Fesrc/modules/usermodes/ src/modules/usermodes/privacy.c $(MODLFLAGS)
+src/modules/sts.dll: src/modules/sts.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/sts.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/sts.pdb $(MODLFLAGS)
 
-src/modules/usermodes/nokick.dll: src/modules/usermodes/nokick.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/usermodes/ /Fesrc/modules/usermodes/ src/modules/usermodes/nokick.c $(MODLFLAGS)
+src/modules/svsjoin.dll: src/modules/svsjoin.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/svsjoin.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/svsjoin.pdb $(MODLFLAGS)
 
-src/modules/usermodes/regonlymsg.dll: src/modules/usermodes/regonlymsg.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/usermodes/ /Fesrc/modules/usermodes/ src/modules/usermodes/regonlymsg.c $(MODLFLAGS)
+src/modules/svskill.dll: src/modules/svskill.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/svskill.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/svskill.pdb $(MODLFLAGS)
 
-src/modules/usermodes/privdeaf.dll: src/modules/usermodes/privdeaf.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/usermodes/ /Fesrc/modules/usermodes/ src/modules/usermodes/privdeaf.c $(MODLFLAGS)
+src/modules/svslusers.dll: src/modules/svslusers.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/svslusers.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/svslusers.pdb $(MODLFLAGS)
 
-src/modules/usermodes/secureonlymsg.dll: src/modules/usermodes/secureonlymsg.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/usermodes/ /Fesrc/modules/usermodes/ src/modules/usermodes/secureonlymsg.c $(MODLFLAGS)
+src/modules/svsmode.dll: src/modules/svsmode.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/svsmode.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/svsmode.pdb $(MODLFLAGS)
 
-src/modules/snomasks/dccreject.dll: src/modules/snomasks/dccreject.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/snomasks/ /Fesrc/modules/snomasks/ src/modules/snomasks/dccreject.c $(MODLFLAGS)
+src/modules/svsmotd.dll: src/modules/svsmotd.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/svsmotd.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/svsmotd.pdb $(MODLFLAGS)
 
-src/modules/extbans/account.dll: src/modules/extbans/account.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/extbans/ /Fesrc/modules/extbans/ src/modules/extbans/account.c $(MODLFLAGS)
+src/modules/svsnick.dll: src/modules/svsnick.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/svsnick.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/svsnick.pdb $(MODLFLAGS)
 
-src/modules/extbans/inchannel.dll: src/modules/extbans/inchannel.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/extbans/ /Fesrc/modules/extbans/ src/modules/extbans/inchannel.c $(MODLFLAGS)
+src/modules/svsnline.dll: src/modules/svsnline.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/svsnline.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/svsnline.pdb $(MODLFLAGS)
 
-src/modules/extbans/join.dll: src/modules/extbans/join.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/extbans/ /Fesrc/modules/extbans/ src/modules/extbans/join.c $(MODLFLAGS)
+src/modules/svsnolag.dll: src/modules/svsnolag.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/svsnolag.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/svsnolag.pdb $(MODLFLAGS)
 
-src/modules/extbans/nickchange.dll: src/modules/extbans/nickchange.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/extbans/ /Fesrc/modules/extbans/ src/modules/extbans/nickchange.c $(MODLFLAGS)
+src/modules/svsnoop.dll: src/modules/svsnoop.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/svsnoop.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/svsnoop.pdb $(MODLFLAGS)
 
-src/modules/extbans/quiet.dll: src/modules/extbans/quiet.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/extbans/ /Fesrc/modules/extbans/ src/modules/extbans/quiet.c $(MODLFLAGS)
+src/modules/svspart.dll: src/modules/svspart.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/svspart.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/svspart.pdb $(MODLFLAGS)
 
-src/modules/extbans/realname.dll: src/modules/extbans/realname.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/extbans/ /Fesrc/modules/extbans/ src/modules/extbans/realname.c $(MODLFLAGS)
+src/modules/svssilence.dll: src/modules/svssilence.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/svssilence.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/svssilence.pdb $(MODLFLAGS)
 
-src/modules/extbans/operclass.dll: src/modules/extbans/operclass.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/extbans/ /Fesrc/modules/extbans/ src/modules/extbans/operclass.c $(MODLFLAGS)
+src/modules/svssno.dll: src/modules/svssno.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/svssno.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/svssno.pdb $(MODLFLAGS)
 
-src/modules/extbans/certfp.dll: src/modules/extbans/certfp.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/extbans/ /Fesrc/modules/extbans/ src/modules/extbans/certfp.c $(MODLFLAGS)
+src/modules/svswatch.dll: src/modules/svswatch.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/svswatch.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/svswatch.pdb $(MODLFLAGS)
 
-src/modules/extbans/textban.dll: src/modules/extbans/textban.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/extbans/ /Fesrc/modules/extbans/ src/modules/extbans/textban.c $(MODLFLAGS)
+src/modules/swhois.dll: src/modules/swhois.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/swhois.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/swhois.pdb $(MODLFLAGS)
 
-src/modules/extbans/msgbypass.dll: src/modules/extbans/msgbypass.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/extbans/ /Fesrc/modules/extbans/ src/modules/extbans/msgbypass.c $(MODLFLAGS)
+src/modules/targetfloodprot.dll: src/modules/targetfloodprot.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/targetfloodprot.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/targetfloodprot.pdb $(MODLFLAGS)
 
-src/modules/extbans/timedban.dll: src/modules/extbans/timedban.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/extbans/ /Fesrc/modules/extbans/ src/modules/extbans/timedban.c $(MODLFLAGS)
+src/modules/time.dll: src/modules/time.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/time.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/time.pdb $(MODLFLAGS)
 
-src/modules/extbans/partmsg.dll: src/modules/extbans/partmsg.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/extbans/ /Fesrc/modules/extbans/ src/modules/extbans/partmsg.c $(MODLFLAGS)
+src/modules/tkl.dll: src/modules/tkl.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/tkl.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/tkl.pdb $(MODLFLAGS)
 
-src/modules/extbans/securitygroup.dll: src/modules/extbans/securitygroup.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/extbans/ /Fesrc/modules/extbans/ src/modules/extbans/securitygroup.c $(MODLFLAGS)
+src/modules/tkldb.dll: src/modules/tkldb.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/tkldb.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/tkldb.pdb $(MODLFLAGS)
 
-src/modules/account-notify.dll: src/modules/account-notify.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/account-notify.c $(MODLFLAGS)
+src/modules/tls_antidos.dll: src/modules/tls_antidos.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/tls_antidos.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/tls_antidos.pdb $(MODLFLAGS)
 
-src/modules/message-tags.dll: src/modules/message-tags.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/message-tags.c $(MODLFLAGS)
+src/modules/tls_cipher.dll: src/modules/tls_cipher.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/tls_cipher.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/tls_cipher.pdb $(MODLFLAGS)
 
-src/modules/batch.dll: src/modules/batch.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/batch.c $(MODLFLAGS)
+src/modules/topic.dll: src/modules/topic.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/topic.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/topic.pdb $(MODLFLAGS)
 
-src/modules/account-tag.dll: src/modules/account-tag.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/account-tag.c $(MODLFLAGS)
+src/modules/trace.dll: src/modules/trace.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/trace.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/trace.pdb $(MODLFLAGS)
 
-src/modules/labeled-response.dll: src/modules/labeled-response.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/labeled-response.c $(MODLFLAGS)
+src/modules/tsctl.dll: src/modules/tsctl.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/tsctl.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/tsctl.pdb $(MODLFLAGS)
 
-src/modules/link-security.dll: src/modules/link-security.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/link-security.c $(MODLFLAGS)
+src/modules/typing-indicator.dll: src/modules/typing-indicator.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/typing-indicator.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/typing-indicator.pdb $(MODLFLAGS)
 
-src/modules/message-ids.dll: src/modules/message-ids.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/message-ids.c $(MODLFLAGS)
+src/modules/umode2.dll: src/modules/umode2.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/umode2.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/umode2.pdb $(MODLFLAGS)
 
-src/modules/plaintext-policy.dll: src/modules/plaintext-policy.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/plaintext-policy.c $(MODLFLAGS)
+src/modules/unreal_server_compat.dll: src/modules/unreal_server_compat.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/unreal_server_compat.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/unreal_server_compat.pdb $(MODLFLAGS)
 
-src/modules/server-time.dll: src/modules/server-time.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/server-time.c $(MODLFLAGS)
+src/modules/unsqline.dll: src/modules/unsqline.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/unsqline.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/unsqline.pdb $(MODLFLAGS)
 
-src/modules/sts.dll: src/modules/sts.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/sts.c $(MODLFLAGS)
+src/modules/user.dll: src/modules/user.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/user.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/user.pdb $(MODLFLAGS)
 
-src/modules/tkldb.dll: src/modules/tkldb.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/tkldb.c $(MODLFLAGS)
+src/modules/userhost.dll: src/modules/userhost.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/userhost.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/userhost.pdb $(MODLFLAGS)
 
-src/modules/channeldb.dll: src/modules/channeldb.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/channeldb.c $(MODLFLAGS)
+src/modules/userhost-tag.dll: src/modules/userhost-tag.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/userhost-tag.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/userhost-tag.pdb $(MODLFLAGS)
 
-src/modules/history_backend_mem.dll: src/modules/history_backend_mem.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/history_backend_mem.c $(MODLFLAGS)
+src/modules/userip.dll: src/modules/userip.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/userip.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/userip.pdb $(MODLFLAGS)
 
-src/modules/history_backend_null.dll: src/modules/history_backend_null.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/history_backend_null.c $(MODLFLAGS)
+src/modules/userip-tag.dll: src/modules/userip-tag.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/userip-tag.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/userip-tag.pdb $(MODLFLAGS)
 
-src/modules/restrict-commands.dll: src/modules/restrict-commands.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/restrict-commands.c $(MODLFLAGS)
+src/modules/usermodes/bot.dll: src/modules/usermodes/bot.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/usermodes/bot.c /Fesrc/modules/usermodes/ /Fosrc/modules/usermodes/ /Fdsrc/modules/usermodes/bot.pdb $(MODLFLAGS)
 
-src/modules/rmtkl.dll: src/modules/rmtkl.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/rmtkl.c $(MODLFLAGS)
+src/modules/usermodes/censor.dll: src/modules/usermodes/censor.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/usermodes/censor.c /Fesrc/modules/usermodes/ /Fosrc/modules/usermodes/ /Fdsrc/modules/usermodes/censor.pdb $(MODLFLAGS)
 
-src/modules/echo-message.dll: src/modules/echo-message.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/echo-message.c $(MODLFLAGS)
+src/modules/usermodes/noctcp.dll: src/modules/usermodes/noctcp.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/usermodes/noctcp.c /Fesrc/modules/usermodes/ /Fosrc/modules/usermodes/ /Fdsrc/modules/usermodes/noctcp.pdb $(MODLFLAGS)
 
-src/modules/userip-tag.dll: src/modules/userip-tag.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/userip-tag.c $(MODLFLAGS)
+src/modules/usermodes/nokick.dll: src/modules/usermodes/nokick.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/usermodes/nokick.c /Fesrc/modules/usermodes/ /Fosrc/modules/usermodes/ /Fdsrc/modules/usermodes/nokick.pdb $(MODLFLAGS)
 
-src/modules/userhost-tag.dll: src/modules/userhost-tag.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/userhost-tag.c $(MODLFLAGS)
+src/modules/usermodes/privacy.dll: src/modules/usermodes/privacy.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/usermodes/privacy.c /Fesrc/modules/usermodes/ /Fosrc/modules/usermodes/ /Fdsrc/modules/usermodes/privacy.pdb $(MODLFLAGS)
 
-src/modules/bot-tag.dll: src/modules/bot-tag.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/bot-tag.c $(MODLFLAGS)
+src/modules/usermodes/privdeaf.dll: src/modules/usermodes/privdeaf.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/usermodes/privdeaf.c /Fesrc/modules/usermodes/ /Fosrc/modules/usermodes/ /Fdsrc/modules/usermodes/privdeaf.pdb $(MODLFLAGS)
 
-src/modules/reply-tag.dll: src/modules/reply-tag.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/reply-tag.c $(MODLFLAGS)
+src/modules/usermodes/regonlymsg.dll: src/modules/usermodes/regonlymsg.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/usermodes/regonlymsg.c /Fesrc/modules/usermodes/ /Fosrc/modules/usermodes/ /Fdsrc/modules/usermodes/regonlymsg.pdb $(MODLFLAGS)
 
-src/modules/require-module.dll: src/modules/require-module.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/require-module.c $(MODLFLAGS)
+src/modules/usermodes/secureonlymsg.dll: src/modules/usermodes/secureonlymsg.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/usermodes/secureonlymsg.c /Fesrc/modules/usermodes/ /Fosrc/modules/usermodes/ /Fdsrc/modules/usermodes/secureonlymsg.pdb $(MODLFLAGS)
 
-src/modules/ident_lookup.dll: src/modules/ident_lookup.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/ident_lookup.c $(MODLFLAGS)
+src/modules/usermodes/servicebot.dll: src/modules/usermodes/servicebot.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/usermodes/servicebot.c /Fesrc/modules/usermodes/ /Fosrc/modules/usermodes/ /Fdsrc/modules/usermodes/servicebot.pdb $(MODLFLAGS)
 
-src/modules/history.dll: src/modules/history.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/history.c $(MODLFLAGS)
+src/modules/usermodes/showwhois.dll: src/modules/usermodes/showwhois.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/usermodes/showwhois.c /Fesrc/modules/usermodes/ /Fosrc/modules/usermodes/ /Fdsrc/modules/usermodes/showwhois.pdb $(MODLFLAGS)
 
-src/modules/chathistory.dll: src/modules/chathistory.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/chathistory.c $(MODLFLAGS)
+src/modules/usermodes/wallops.dll: src/modules/usermodes/wallops.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/usermodes/wallops.c /Fesrc/modules/usermodes/ /Fosrc/modules/usermodes/ /Fdsrc/modules/usermodes/wallops.pdb $(MODLFLAGS)
 
-src/modules/targetfloodprot.dll: src/modules/targetfloodprot.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/targetfloodprot.c $(MODLFLAGS)
+src/modules/vhost.dll: src/modules/vhost.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/vhost.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/vhost.pdb $(MODLFLAGS)
 
-src/modules/typing-indicator.dll: src/modules/typing-indicator.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/typing-indicator.c $(MODLFLAGS)
+src/modules/watch-backend.dll: src/modules/watch-backend.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/watch-backend.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/watch-backend.pdb $(MODLFLAGS)
 
-src/modules/clienttagdeny.dll: src/modules/clienttagdeny.c $(INCLUDES)
-	$(CC) $(MODCFLAGS) /Fosrc/modules/ /Fesrc/modules/ src/modules/clienttagdeny.c $(MODLFLAGS)
+src/modules/watch.dll: src/modules/watch.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/watch.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/watch.pdb $(MODLFLAGS)
+
+src/modules/webirc.dll: src/modules/webirc.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/webirc.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/webirc.pdb $(MODLFLAGS)
+
+src/modules/webredir.dll: src/modules/webredir.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/webredir.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/webredir.pdb $(MODLFLAGS)
+
+src/modules/websocket.dll: src/modules/websocket.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/websocket.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/websocket.pdb $(MODLFLAGS)
+
+src/modules/whois.dll: src/modules/whois.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/whois.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/whois.pdb $(MODLFLAGS)
+
+src/modules/who_old.dll: src/modules/who_old.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/who_old.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/who_old.pdb $(MODLFLAGS)
+
+src/modules/whowas.dll: src/modules/whowas.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/whowas.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/whowas.pdb $(MODLFLAGS)
+
+src/modules/whox.dll: src/modules/whox.c $(INCLUDES)
+	$(CC) $(MODCFLAGS) src/modules/whox.c /Fesrc/modules/ /Fosrc/modules/ /Fdsrc/modules/whox.pdb $(MODLFLAGS)
 
-dummy:
diff --git a/README.md b/README.md
@@ -9,6 +9,11 @@ Key features include SSL/TLS, cloaking, its advanced anti-flood and anti-spam sy
 swear filtering and module support. We are also particularly proud on our extensive
 online documentation. 
 
+## Versions
+* UnrealIRCd 6 is the *stable* series since December 2021. All new features go in there.
+* UnrealIRCd 5 is the *oldstable* series. It will receive bug fixes until
+  July 1, 2022 plus another 12 months of security fixes.
+
 ## How to get started
 Please consult our excellent online documentation at https://www.unrealircd.org/docs/
 when setting up the IRCd!
diff --git a/SECURITY.md b/SECURITY.md
@@ -1,7 +1,8 @@
 # Security Policy
 
 ## Supported Versions
-* The latest *stable* release of the 5.x branch
+* The latest *stable* release of UnrealIRCd 5 (until 2023-07-01)
+* The latest *stable* release of UnrealIRCd 6
 
 See [UnrealIRCd releases](https://www.unrealircd.org/docs/UnrealIRCd_releases) for information on older versions and End Of Life dates.
 
diff --git a/autoconf/config.guess b/autoconf/config.guess
@@ -1,8 +1,10 @@
 #! /bin/sh
 # Attempt to guess a canonical system name.
-#   Copyright 1992-2015 Free Software Foundation, Inc.
+#   Copyright 1992-2021 Free Software Foundation, Inc.
 
-timestamp='2015-03-04'
+# shellcheck disable=SC2006,SC2268 # see below for rationale
+
+timestamp='2021-06-03'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -15,7 +17,7 @@ timestamp='2015-03-04'
 # General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program; if not, see <http://www.gnu.org/licenses/>.
+# along with this program; if not, see <https://www.gnu.org/licenses/>.
 #
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
@@ -27,11 +29,19 @@ timestamp='2015-03-04'
 # Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
 #
 # You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+# https://git.savannah.gnu.org/cgit/config.git/plain/config.guess
 #
 # Please send patches to <config-patches@gnu.org>.
 
 
+# The "shellcheck disable" line above the timestamp inhibits complaints
+# about features and limitations of the classic Bourne shell that were
+# superseded or lifted in POSIX.  However, this script identifies a wide
+# variety of pre-POSIX systems that do not have POSIX shells at all, and
+# even some reasonably current systems (Solaris 10 as case-in-point) still
+# have a pre-POSIX /bin/sh.
+
+
 me=`echo "$0" | sed -e 's,.*/,,'`
 
 usage="\
@@ -39,7 +49,7 @@ Usage: $0 [OPTION]
 
 Output the configuration name of the system \`$me' is run on.
 
-Operation modes:
+Options:
   -h, --help         print this help, then exit
   -t, --time-stamp   print date of last modification, then exit
   -v, --version      print version number, then exit
@@ -50,7 +60,7 @@ version="\
 GNU config.guess ($timestamp)
 
 Originally written by Per Bothner.
-Copyright 1992-2015 Free Software Foundation, Inc.
+Copyright 1992-2021 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -84,7 +94,8 @@ if test $# != 0; then
   exit 1
 fi
 
-trap 'exit 1' 1 2 15
+# Just in case it came from the environment.
+GUESS=
 
 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a
 # compiler to aid in system detection is discouraged as it requires
@@ -96,66 +107,90 @@ trap 'exit 1' 1 2 15
 
 # Portable tmp directory creation inspired by the Autoconf team.
 
-set_cc_for_build='
-trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
-trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
-: ${TMPDIR=/tmp} ;
- { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
- { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
- { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
- { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
-dummy=$tmp/dummy ;
-tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
-case $CC_FOR_BUILD,$HOST_CC,$CC in
- ,,)    echo "int x;" > $dummy.c ;
-	for c in cc gcc c89 c99 ; do
-	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
-	     CC_FOR_BUILD="$c"; break ;
-	  fi ;
-	done ;
-	if test x"$CC_FOR_BUILD" = x ; then
-	  CC_FOR_BUILD=no_compiler_found ;
-	fi
-	;;
- ,,*)   CC_FOR_BUILD=$CC ;;
- ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
-esac ; set_cc_for_build= ;'
+tmp=
+# shellcheck disable=SC2172
+trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15
+
+set_cc_for_build() {
+    # prevent multiple calls if $tmp is already set
+    test "$tmp" && return 0
+    : "${TMPDIR=/tmp}"
+    # shellcheck disable=SC2039,SC3028
+    { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+	{ test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } ||
+	{ tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+	{ echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; }
+    dummy=$tmp/dummy
+    case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in
+	,,)    echo "int x;" > "$dummy.c"
+	       for driver in cc gcc c89 c99 ; do
+		   if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then
+		       CC_FOR_BUILD=$driver
+		       break
+		   fi
+	       done
+	       if test x"$CC_FOR_BUILD" = x ; then
+		   CC_FOR_BUILD=no_compiler_found
+	       fi
+	       ;;
+	,,*)   CC_FOR_BUILD=$CC ;;
+	,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+    esac
+}
 
 # This is needed to find uname on a Pyramid OSx when run in the BSD universe.
 # (ghazi@noc.rutgers.edu 1994-08-24)
-if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+if test -f /.attbin/uname ; then
 	PATH=$PATH:/.attbin ; export PATH
 fi
 
 UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
 UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
-UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
 UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
 
-case "${UNAME_SYSTEM}" in
+case $UNAME_SYSTEM in
 Linux|GNU|GNU/*)
-	# If the system lacks a compiler, then just pick glibc.
-	# We could probably try harder.
-	LIBC=gnu
+	LIBC=unknown
 
-	eval $set_cc_for_build
-	cat <<-EOF > $dummy.c
+	set_cc_for_build
+	cat <<-EOF > "$dummy.c"
 	#include <features.h>
 	#if defined(__UCLIBC__)
 	LIBC=uclibc
 	#elif defined(__dietlibc__)
 	LIBC=dietlibc
-	#else
+	#elif defined(__GLIBC__)
 	LIBC=gnu
+	#else
+	#include <stdarg.h>
+	/* First heuristic to detect musl libc.  */
+	#ifdef __DEFINED_va_list
+	LIBC=musl
+	#endif
 	#endif
 	EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
+	cc_set_libc=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
+	eval "$cc_set_libc"
+
+	# Second heuristic to detect musl libc.
+	if [ "$LIBC" = unknown ] &&
+	   command -v ldd >/dev/null &&
+	   ldd --version 2>&1 | grep -q ^musl; then
+		LIBC=musl
+	fi
+
+	# If the system lacks a compiler, then just pick glibc.
+	# We could probably try harder.
+	if [ "$LIBC" = unknown ]; then
+		LIBC=gnu
+	fi
 	;;
 esac
 
 # Note: order is significant - the case branches are not exclusive.
 
-case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+case $UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION in
     *:NetBSD:*:*)
 	# NetBSD (nbsd) targets should (where applicable) match one or
 	# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
@@ -167,29 +202,32 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 	#
 	# Note: NetBSD doesn't particularly care about the vendor
 	# portion of the name.  We always set it to "unknown".
-	sysctl="sysctl -n hw.machine_arch"
 	UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
-	    /sbin/$sysctl 2>/dev/null || \
-	    /usr/sbin/$sysctl 2>/dev/null || \
+	    /sbin/sysctl -n hw.machine_arch 2>/dev/null || \
+	    /usr/sbin/sysctl -n hw.machine_arch 2>/dev/null || \
 	    echo unknown)`
-	case "${UNAME_MACHINE_ARCH}" in
+	case $UNAME_MACHINE_ARCH in
+	    aarch64eb) machine=aarch64_be-unknown ;;
 	    armeb) machine=armeb-unknown ;;
 	    arm*) machine=arm-unknown ;;
 	    sh3el) machine=shl-unknown ;;
 	    sh3eb) machine=sh-unknown ;;
 	    sh5el) machine=sh5le-unknown ;;
 	    earmv*)
-		arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
-		endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'`
+		arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
+		endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'`
 		machine=${arch}${endian}-unknown
 		;;
-	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+	    *) machine=$UNAME_MACHINE_ARCH-unknown ;;
 	esac
 	# The Operating System including object format, if it has switched
-	# to ELF recently, or will in the future.
-	case "${UNAME_MACHINE_ARCH}" in
-	    arm*|earm*|i386|m68k|ns32k|sh3*|sparc|vax)
-		eval $set_cc_for_build
+	# to ELF recently (or will in the future) and ABI.
+	case $UNAME_MACHINE_ARCH in
+	    earm*)
+		os=netbsdelf
+		;;
+	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+		set_cc_for_build
 		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
 			| grep -q __ELF__
 		then
@@ -205,10 +243,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 		;;
 	esac
 	# Determine ABI tags.
-	case "${UNAME_MACHINE_ARCH}" in
+	case $UNAME_MACHINE_ARCH in
 	    earm*)
 		expr='s/^earmv[0-9]/-eabi/;s/eb$//'
-		abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"`
+		abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"`
 		;;
 	esac
 	# The OS release
@@ -216,40 +254,68 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 	# thus, need a distinct triplet. However, they do not need
 	# kernel version information, so it can be replaced with a
 	# suitable tag, in the style of linux-gnu.
-	case "${UNAME_VERSION}" in
+	case $UNAME_VERSION in
 	    Debian*)
 		release='-gnu'
 		;;
 	    *)
-		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+		release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2`
 		;;
 	esac
 	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
 	# contains redundant information, the shorter form:
 	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
-	echo "${machine}-${os}${release}${abi}"
-	exit ;;
+	GUESS=$machine-${os}${release}${abi-}
+	;;
     *:Bitrig:*:*)
 	UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
-	echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE}
-	exit ;;
+	GUESS=$UNAME_MACHINE_ARCH-unknown-bitrig$UNAME_RELEASE
+	;;
     *:OpenBSD:*:*)
 	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
-	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
-	exit ;;
+	GUESS=$UNAME_MACHINE_ARCH-unknown-openbsd$UNAME_RELEASE
+	;;
+    *:SecBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/SecBSD.//'`
+	GUESS=$UNAME_MACHINE_ARCH-unknown-secbsd$UNAME_RELEASE
+	;;
+    *:LibertyBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'`
+	GUESS=$UNAME_MACHINE_ARCH-unknown-libertybsd$UNAME_RELEASE
+	;;
+    *:MidnightBSD:*:*)
+	GUESS=$UNAME_MACHINE-unknown-midnightbsd$UNAME_RELEASE
+	;;
     *:ekkoBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-ekkobsd$UNAME_RELEASE
+	;;
     *:SolidBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-solidbsd$UNAME_RELEASE
+	;;
+    *:OS108:*:*)
+	GUESS=$UNAME_MACHINE-unknown-os108_$UNAME_RELEASE
+	;;
     macppc:MirBSD:*:*)
-	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
-	exit ;;
+	GUESS=powerpc-unknown-mirbsd$UNAME_RELEASE
+	;;
     *:MirBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-mirbsd$UNAME_RELEASE
+	;;
+    *:Sortix:*:*)
+	GUESS=$UNAME_MACHINE-unknown-sortix
+	;;
+    *:Twizzler:*:*)
+	GUESS=$UNAME_MACHINE-unknown-twizzler
+	;;
+    *:Redox:*:*)
+	GUESS=$UNAME_MACHINE-unknown-redox
+	;;
+    mips:OSF1:*.*)
+	GUESS=mips-dec-osf1
+	;;
     alpha:OSF1:*:*)
+	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+	trap '' 0
 	case $UNAME_RELEASE in
 	*4.0)
 		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
@@ -263,163 +329,158 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 	# covers most systems running today.  This code pipes the CPU
 	# types through head -n 1, so we only detect the type of CPU 0.
 	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
-	case "$ALPHA_CPU_TYPE" in
+	case $ALPHA_CPU_TYPE in
 	    "EV4 (21064)")
-		UNAME_MACHINE="alpha" ;;
+		UNAME_MACHINE=alpha ;;
 	    "EV4.5 (21064)")
-		UNAME_MACHINE="alpha" ;;
+		UNAME_MACHINE=alpha ;;
 	    "LCA4 (21066/21068)")
-		UNAME_MACHINE="alpha" ;;
+		UNAME_MACHINE=alpha ;;
 	    "EV5 (21164)")
-		UNAME_MACHINE="alphaev5" ;;
+		UNAME_MACHINE=alphaev5 ;;
 	    "EV5.6 (21164A)")
-		UNAME_MACHINE="alphaev56" ;;
+		UNAME_MACHINE=alphaev56 ;;
 	    "EV5.6 (21164PC)")
-		UNAME_MACHINE="alphapca56" ;;
+		UNAME_MACHINE=alphapca56 ;;
 	    "EV5.7 (21164PC)")
-		UNAME_MACHINE="alphapca57" ;;
+		UNAME_MACHINE=alphapca57 ;;
 	    "EV6 (21264)")
-		UNAME_MACHINE="alphaev6" ;;
+		UNAME_MACHINE=alphaev6 ;;
 	    "EV6.7 (21264A)")
-		UNAME_MACHINE="alphaev67" ;;
+		UNAME_MACHINE=alphaev67 ;;
 	    "EV6.8CB (21264C)")
-		UNAME_MACHINE="alphaev68" ;;
+		UNAME_MACHINE=alphaev68 ;;
 	    "EV6.8AL (21264B)")
-		UNAME_MACHINE="alphaev68" ;;
+		UNAME_MACHINE=alphaev68 ;;
 	    "EV6.8CX (21264D)")
-		UNAME_MACHINE="alphaev68" ;;
+		UNAME_MACHINE=alphaev68 ;;
 	    "EV6.9A (21264/EV69A)")
-		UNAME_MACHINE="alphaev69" ;;
+		UNAME_MACHINE=alphaev69 ;;
 	    "EV7 (21364)")
-		UNAME_MACHINE="alphaev7" ;;
+		UNAME_MACHINE=alphaev7 ;;
 	    "EV7.9 (21364A)")
-		UNAME_MACHINE="alphaev79" ;;
+		UNAME_MACHINE=alphaev79 ;;
 	esac
 	# A Pn.n version is a patched version.
 	# A Vn.n version is a released version.
 	# A Tn.n version is a released field test version.
 	# A Xn.n version is an unreleased experimental baselevel.
 	# 1.2 uses "1.2" for uname -r.
-	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
-	exitcode=$?
-	trap '' 0
-	exit $exitcode ;;
-    Alpha\ *:Windows_NT*:*)
-	# How do we know it's Interix rather than the generic POSIX subsystem?
-	# Should we change UNAME_MACHINE based on the output of uname instead
-	# of the specific Alpha model?
-	echo alpha-pc-interix
-	exit ;;
-    21064:Windows_NT:50:3)
-	echo alpha-dec-winnt3.5
-	exit ;;
+	OSF_REL=`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+	GUESS=$UNAME_MACHINE-dec-osf$OSF_REL
+	;;
     Amiga*:UNIX_System_V:4.0:*)
-	echo m68k-unknown-sysv4
-	exit ;;
+	GUESS=m68k-unknown-sysv4
+	;;
     *:[Aa]miga[Oo][Ss]:*:*)
-	echo ${UNAME_MACHINE}-unknown-amigaos
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-amigaos
+	;;
     *:[Mm]orph[Oo][Ss]:*:*)
-	echo ${UNAME_MACHINE}-unknown-morphos
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-morphos
+	;;
     *:OS/390:*:*)
-	echo i370-ibm-openedition
-	exit ;;
+	GUESS=i370-ibm-openedition
+	;;
     *:z/VM:*:*)
-	echo s390-ibm-zvmoe
-	exit ;;
+	GUESS=s390-ibm-zvmoe
+	;;
     *:OS400:*:*)
-	echo powerpc-ibm-os400
-	exit ;;
+	GUESS=powerpc-ibm-os400
+	;;
     arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
-	echo arm-acorn-riscix${UNAME_RELEASE}
-	exit ;;
+	GUESS=arm-acorn-riscix$UNAME_RELEASE
+	;;
     arm*:riscos:*:*|arm*:RISCOS:*:*)
-	echo arm-unknown-riscos
-	exit ;;
+	GUESS=arm-unknown-riscos
+	;;
     SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
-	echo hppa1.1-hitachi-hiuxmpp
-	exit ;;
+	GUESS=hppa1.1-hitachi-hiuxmpp
+	;;
     Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
 	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
-	if test "`(/bin/universe) 2>/dev/null`" = att ; then
-		echo pyramid-pyramid-sysv3
-	else
-		echo pyramid-pyramid-bsd
-	fi
-	exit ;;
+	case `(/bin/universe) 2>/dev/null` in
+	    att) GUESS=pyramid-pyramid-sysv3 ;;
+	    *)   GUESS=pyramid-pyramid-bsd   ;;
+	esac
+	;;
     NILE*:*:*:dcosx)
-	echo pyramid-pyramid-svr4
-	exit ;;
+	GUESS=pyramid-pyramid-svr4
+	;;
     DRS?6000:unix:4.0:6*)
-	echo sparc-icl-nx6
-	exit ;;
+	GUESS=sparc-icl-nx6
+	;;
     DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
 	case `/usr/bin/uname -p` in
-	    sparc) echo sparc-icl-nx7; exit ;;
-	esac ;;
+	    sparc) GUESS=sparc-icl-nx7 ;;
+	esac
+	;;
     s390x:SunOS:*:*)
-	echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
+	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+	GUESS=$UNAME_MACHINE-ibm-solaris2$SUN_REL
+	;;
     sun4H:SunOS:5.*:*)
-	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
+	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+	GUESS=sparc-hal-solaris2$SUN_REL
+	;;
     sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
-	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
+	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+	GUESS=sparc-sun-solaris2$SUN_REL
+	;;
     i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
-	echo i386-pc-auroraux${UNAME_RELEASE}
-	exit ;;
+	GUESS=i386-pc-auroraux$UNAME_RELEASE
+	;;
     i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
-	eval $set_cc_for_build
-	SUN_ARCH="i386"
+	set_cc_for_build
+	SUN_ARCH=i386
 	# If there is a compiler, see if it is configured for 64-bit objects.
 	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
 	# This test works for both compilers.
-	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+	if test "$CC_FOR_BUILD" != no_compiler_found; then
 	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
-		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		(CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
 		grep IS_64BIT_ARCH >/dev/null
 	    then
-		SUN_ARCH="x86_64"
+		SUN_ARCH=x86_64
 	    fi
 	fi
-	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
+	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+	GUESS=$SUN_ARCH-pc-solaris2$SUN_REL
+	;;
     sun4*:SunOS:6*:*)
 	# According to config.sub, this is the proper way to canonicalize
 	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
 	# it's likely to be more like Solaris than SunOS4.
-	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
+	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+	GUESS=sparc-sun-solaris3$SUN_REL
+	;;
     sun4*:SunOS:*:*)
-	case "`/usr/bin/arch -k`" in
+	case `/usr/bin/arch -k` in
 	    Series*|S4*)
 		UNAME_RELEASE=`uname -v`
 		;;
 	esac
 	# Japanese Language versions have a version number like `4.1.3-JL'.
-	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
-	exit ;;
+	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/'`
+	GUESS=sparc-sun-sunos$SUN_REL
+	;;
     sun3*:SunOS:*:*)
-	echo m68k-sun-sunos${UNAME_RELEASE}
-	exit ;;
+	GUESS=m68k-sun-sunos$UNAME_RELEASE
+	;;
     sun*:*:4.2BSD:*)
 	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
-	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
-	case "`/bin/arch`" in
+	test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3
+	case `/bin/arch` in
 	    sun3)
-		echo m68k-sun-sunos${UNAME_RELEASE}
+		GUESS=m68k-sun-sunos$UNAME_RELEASE
 		;;
 	    sun4)
-		echo sparc-sun-sunos${UNAME_RELEASE}
+		GUESS=sparc-sun-sunos$UNAME_RELEASE
 		;;
 	esac
-	exit ;;
+	;;
     aushp:SunOS:*:*)
-	echo sparc-auspex-sunos${UNAME_RELEASE}
-	exit ;;
+	GUESS=sparc-auspex-sunos$UNAME_RELEASE
+	;;
     # The situation for MiNT is a little confusing.  The machine name
     # can be virtually everything (everything which is not
     # "atarist" or "atariste" at least should have a processor
@@ -429,44 +490,44 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
     # MiNT.  But MiNT is downward compatible to TOS, so this should
     # be no problem.
     atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
-	echo m68k-atari-mint${UNAME_RELEASE}
-	exit ;;
+	GUESS=m68k-atari-mint$UNAME_RELEASE
+	;;
     atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
-	echo m68k-atari-mint${UNAME_RELEASE}
-	exit ;;
+	GUESS=m68k-atari-mint$UNAME_RELEASE
+	;;
     *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
-	echo m68k-atari-mint${UNAME_RELEASE}
-	exit ;;
+	GUESS=m68k-atari-mint$UNAME_RELEASE
+	;;
     milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
-	echo m68k-milan-mint${UNAME_RELEASE}
-	exit ;;
+	GUESS=m68k-milan-mint$UNAME_RELEASE
+	;;
     hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
-	echo m68k-hades-mint${UNAME_RELEASE}
-	exit ;;
+	GUESS=m68k-hades-mint$UNAME_RELEASE
+	;;
     *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
-	echo m68k-unknown-mint${UNAME_RELEASE}
-	exit ;;
+	GUESS=m68k-unknown-mint$UNAME_RELEASE
+	;;
     m68k:machten:*:*)
-	echo m68k-apple-machten${UNAME_RELEASE}
-	exit ;;
+	GUESS=m68k-apple-machten$UNAME_RELEASE
+	;;
     powerpc:machten:*:*)
-	echo powerpc-apple-machten${UNAME_RELEASE}
-	exit ;;
+	GUESS=powerpc-apple-machten$UNAME_RELEASE
+	;;
     RISC*:Mach:*:*)
-	echo mips-dec-mach_bsd4.3
-	exit ;;
+	GUESS=mips-dec-mach_bsd4.3
+	;;
     RISC*:ULTRIX:*:*)
-	echo mips-dec-ultrix${UNAME_RELEASE}
-	exit ;;
+	GUESS=mips-dec-ultrix$UNAME_RELEASE
+	;;
     VAX*:ULTRIX*:*:*)
-	echo vax-dec-ultrix${UNAME_RELEASE}
-	exit ;;
+	GUESS=vax-dec-ultrix$UNAME_RELEASE
+	;;
     2020:CLIX:*:* | 2430:CLIX:*:*)
-	echo clipper-intergraph-clix${UNAME_RELEASE}
-	exit ;;
+	GUESS=clipper-intergraph-clix$UNAME_RELEASE
+	;;
     mips:*:*:UMIPS | mips:*:*:RISCos)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
+	set_cc_for_build
+	sed 's/^	//' << EOF > "$dummy.c"
 #ifdef __cplusplus
 #include <stdio.h>  /* for printf() prototype */
 	int main (int argc, char *argv[]) {
@@ -475,95 +536,96 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
 #endif
 	#if defined (host_mips) && defined (MIPSEB)
 	#if defined (SYSTYPE_SYSV)
-	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+	  printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0);
 	#endif
 	#if defined (SYSTYPE_SVR4)
-	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+	  printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0);
 	#endif
 	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
-	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+	  printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0);
 	#endif
 	#endif
 	  exit (-1);
 	}
 EOF
-	$CC_FOR_BUILD -o $dummy $dummy.c &&
-	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
-	  SYSTEM_NAME=`$dummy $dummyarg` &&
+	$CC_FOR_BUILD -o "$dummy" "$dummy.c" &&
+	  dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+	  SYSTEM_NAME=`"$dummy" "$dummyarg"` &&
 	    { echo "$SYSTEM_NAME"; exit; }
-	echo mips-mips-riscos${UNAME_RELEASE}
-	exit ;;
+	GUESS=mips-mips-riscos$UNAME_RELEASE
+	;;
     Motorola:PowerMAX_OS:*:*)
-	echo powerpc-motorola-powermax
-	exit ;;
+	GUESS=powerpc-motorola-powermax
+	;;
     Motorola:*:4.3:PL8-*)
-	echo powerpc-harris-powermax
-	exit ;;
+	GUESS=powerpc-harris-powermax
+	;;
     Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
-	echo powerpc-harris-powermax
-	exit ;;
+	GUESS=powerpc-harris-powermax
+	;;
     Night_Hawk:Power_UNIX:*:*)
-	echo powerpc-harris-powerunix
-	exit ;;
+	GUESS=powerpc-harris-powerunix
+	;;
     m88k:CX/UX:7*:*)
-	echo m88k-harris-cxux7
-	exit ;;
+	GUESS=m88k-harris-cxux7
+	;;
     m88k:*:4*:R4*)
-	echo m88k-motorola-sysv4
-	exit ;;
+	GUESS=m88k-motorola-sysv4
+	;;
     m88k:*:3*:R3*)
-	echo m88k-motorola-sysv3
-	exit ;;
+	GUESS=m88k-motorola-sysv3
+	;;
     AViiON:dgux:*:*)
 	# DG/UX returns AViiON for all architectures
 	UNAME_PROCESSOR=`/usr/bin/uname -p`
-	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+	if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110
 	then
-	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
-	       [ ${TARGET_BINARY_INTERFACE}x = x ]
+	    if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \
+	       test "$TARGET_BINARY_INTERFACE"x = x
 	    then
-		echo m88k-dg-dgux${UNAME_RELEASE}
+		GUESS=m88k-dg-dgux$UNAME_RELEASE
 	    else
-		echo m88k-dg-dguxbcs${UNAME_RELEASE}
+		GUESS=m88k-dg-dguxbcs$UNAME_RELEASE
 	    fi
 	else
-	    echo i586-dg-dgux${UNAME_RELEASE}
+	    GUESS=i586-dg-dgux$UNAME_RELEASE
 	fi
-	exit ;;
+	;;
     M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
-	echo m88k-dolphin-sysv3
-	exit ;;
+	GUESS=m88k-dolphin-sysv3
+	;;
     M88*:*:R3*:*)
 	# Delta 88k system running SVR3
-	echo m88k-motorola-sysv3
-	exit ;;
+	GUESS=m88k-motorola-sysv3
+	;;
     XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
-	echo m88k-tektronix-sysv3
-	exit ;;
+	GUESS=m88k-tektronix-sysv3
+	;;
     Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
-	echo m68k-tektronix-bsd
-	exit ;;
+	GUESS=m68k-tektronix-bsd
+	;;
     *:IRIX*:*:*)
-	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
-	exit ;;
+	IRIX_REL=`echo "$UNAME_RELEASE" | sed -e 's/-/_/g'`
+	GUESS=mips-sgi-irix$IRIX_REL
+	;;
     ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
-	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
-	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
+	GUESS=romp-ibm-aix    # uname -m gives an 8 hex-code CPU id
+	;;                    # Note that: echo "'`uname -s`'" gives 'AIX '
     i*86:AIX:*:*)
-	echo i386-ibm-aix
-	exit ;;
+	GUESS=i386-ibm-aix
+	;;
     ia64:AIX:*:*)
-	if [ -x /usr/bin/oslevel ] ; then
+	if test -x /usr/bin/oslevel ; then
 		IBM_REV=`/usr/bin/oslevel`
 	else
-		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+		IBM_REV=$UNAME_VERSION.$UNAME_RELEASE
 	fi
-	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
-	exit ;;
+	GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV
+	;;
     *:AIX:2:3)
 	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
-		eval $set_cc_for_build
-		sed 's/^		//' << EOF >$dummy.c
+		set_cc_for_build
+		sed 's/^		//' << EOF > "$dummy.c"
 		#include <sys/systemcfg.h>
 
 		main()
@@ -574,77 +636,77 @@ EOF
 			exit(0);
 			}
 EOF
-		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+		if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"`
 		then
-			echo "$SYSTEM_NAME"
+			GUESS=$SYSTEM_NAME
 		else
-			echo rs6000-ibm-aix3.2.5
+			GUESS=rs6000-ibm-aix3.2.5
 		fi
 	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
-		echo rs6000-ibm-aix3.2.4
+		GUESS=rs6000-ibm-aix3.2.4
 	else
-		echo rs6000-ibm-aix3.2
+		GUESS=rs6000-ibm-aix3.2
 	fi
-	exit ;;
+	;;
     *:AIX:*:[4567])
 	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
-	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+	if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then
 		IBM_ARCH=rs6000
 	else
 		IBM_ARCH=powerpc
 	fi
-	if [ -x /usr/bin/lslpp ] ; then
-		IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |
+	if test -x /usr/bin/lslpp ; then
+		IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | \
 			   awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
 	else
-		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+		IBM_REV=$UNAME_VERSION.$UNAME_RELEASE
 	fi
-	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
-	exit ;;
+	GUESS=$IBM_ARCH-ibm-aix$IBM_REV
+	;;
     *:AIX:*:*)
-	echo rs6000-ibm-aix
-	exit ;;
-    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
-	echo romp-ibm-bsd4.4
-	exit ;;
+	GUESS=rs6000-ibm-aix
+	;;
+    ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*)
+	GUESS=romp-ibm-bsd4.4
+	;;
     ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
-	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
-	exit ;;                             # report: romp-ibm BSD 4.3
+	GUESS=romp-ibm-bsd$UNAME_RELEASE    # 4.3 with uname added to
+	;;                                  # report: romp-ibm BSD 4.3
     *:BOSX:*:*)
-	echo rs6000-bull-bosx
-	exit ;;
+	GUESS=rs6000-bull-bosx
+	;;
     DPX/2?00:B.O.S.:*:*)
-	echo m68k-bull-sysv3
-	exit ;;
+	GUESS=m68k-bull-sysv3
+	;;
     9000/[34]??:4.3bsd:1.*:*)
-	echo m68k-hp-bsd
-	exit ;;
+	GUESS=m68k-hp-bsd
+	;;
     hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
-	echo m68k-hp-bsd4.4
-	exit ;;
+	GUESS=m68k-hp-bsd4.4
+	;;
     9000/[34678]??:HP-UX:*:*)
-	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-	case "${UNAME_MACHINE}" in
-	    9000/31? )            HP_ARCH=m68000 ;;
-	    9000/[34]?? )         HP_ARCH=m68k ;;
+	HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'`
+	case $UNAME_MACHINE in
+	    9000/31?)            HP_ARCH=m68000 ;;
+	    9000/[34]??)         HP_ARCH=m68k ;;
 	    9000/[678][0-9][0-9])
-		if [ -x /usr/bin/getconf ]; then
+		if test -x /usr/bin/getconf; then
 		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
 		    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
-		    case "${sc_cpu_version}" in
-		      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
-		      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+		    case $sc_cpu_version in
+		      523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0
+		      528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1
 		      532)                      # CPU_PA_RISC2_0
-			case "${sc_kernel_bits}" in
-			  32) HP_ARCH="hppa2.0n" ;;
-			  64) HP_ARCH="hppa2.0w" ;;
-			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+			case $sc_kernel_bits in
+			  32) HP_ARCH=hppa2.0n ;;
+			  64) HP_ARCH=hppa2.0w ;;
+			  '') HP_ARCH=hppa2.0 ;;   # HP-UX 10.20
 			esac ;;
 		    esac
 		fi
-		if [ "${HP_ARCH}" = "" ]; then
-		    eval $set_cc_for_build
-		    sed 's/^		//' << EOF >$dummy.c
+		if test "$HP_ARCH" = ""; then
+		    set_cc_for_build
+		    sed 's/^		//' << EOF > "$dummy.c"
 
 		#define _HPUX_SOURCE
 		#include <stdlib.h>
@@ -677,13 +739,13 @@ EOF
 		    exit (0);
 		}
 EOF
-		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+		    (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"`
 		    test -z "$HP_ARCH" && HP_ARCH=hppa
 		fi ;;
 	esac
-	if [ ${HP_ARCH} = "hppa2.0w" ]
+	if test "$HP_ARCH" = hppa2.0w
 	then
-	    eval $set_cc_for_build
+	    set_cc_for_build
 
 	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
 	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
@@ -694,23 +756,23 @@ EOF
 	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
 	    # => hppa64-hp-hpux11.23
 
-	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+	    if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) |
 		grep -q __LP64__
 	    then
-		HP_ARCH="hppa2.0w"
+		HP_ARCH=hppa2.0w
 	    else
-		HP_ARCH="hppa64"
+		HP_ARCH=hppa64
 	    fi
 	fi
-	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
-	exit ;;
+	GUESS=$HP_ARCH-hp-hpux$HPUX_REV
+	;;
     ia64:HP-UX:*:*)
-	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-	echo ia64-hp-hpux${HPUX_REV}
-	exit ;;
+	HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'`
+	GUESS=ia64-hp-hpux$HPUX_REV
+	;;
     3050*:HI-UX:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
+	set_cc_for_build
+	sed 's/^	//' << EOF > "$dummy.c"
 	#include <unistd.h>
 	int
 	main ()
@@ -735,38 +797,38 @@ EOF
 	  exit (0);
 	}
 EOF
-	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+	$CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` &&
 		{ echo "$SYSTEM_NAME"; exit; }
-	echo unknown-hitachi-hiuxwe2
-	exit ;;
-    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
-	echo hppa1.1-hp-bsd
-	exit ;;
+	GUESS=unknown-hitachi-hiuxwe2
+	;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*)
+	GUESS=hppa1.1-hp-bsd
+	;;
     9000/8??:4.3bsd:*:*)
-	echo hppa1.0-hp-bsd
-	exit ;;
+	GUESS=hppa1.0-hp-bsd
+	;;
     *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
-	echo hppa1.0-hp-mpeix
-	exit ;;
-    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
-	echo hppa1.1-hp-osf
-	exit ;;
+	GUESS=hppa1.0-hp-mpeix
+	;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*)
+	GUESS=hppa1.1-hp-osf
+	;;
     hp8??:OSF1:*:*)
-	echo hppa1.0-hp-osf
-	exit ;;
+	GUESS=hppa1.0-hp-osf
+	;;
     i*86:OSF1:*:*)
-	if [ -x /usr/sbin/sysversion ] ; then
-	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	if test -x /usr/sbin/sysversion ; then
+	    GUESS=$UNAME_MACHINE-unknown-osf1mk
 	else
-	    echo ${UNAME_MACHINE}-unknown-osf1
+	    GUESS=$UNAME_MACHINE-unknown-osf1
 	fi
-	exit ;;
+	;;
     parisc*:Lites*:*:*)
-	echo hppa1.1-hp-lites
-	exit ;;
+	GUESS=hppa1.1-hp-lites
+	;;
     C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
-	echo c1-convex-bsd
-	exit ;;
+	GUESS=c1-convex-bsd
+	;;
     C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
 	if getsysinfo -f scalar_acc
 	then echo c32-convex-bsd
@@ -774,139 +836,145 @@ EOF
 	fi
 	exit ;;
     C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
-	echo c34-convex-bsd
-	exit ;;
+	GUESS=c34-convex-bsd
+	;;
     C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
-	echo c38-convex-bsd
-	exit ;;
+	GUESS=c38-convex-bsd
+	;;
     C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
-	echo c4-convex-bsd
-	exit ;;
+	GUESS=c4-convex-bsd
+	;;
     CRAY*Y-MP:*:*:*)
-	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
+	CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+	GUESS=ymp-cray-unicos$CRAY_REL
+	;;
     CRAY*[A-Z]90:*:*:*)
-	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+	echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \
 	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
 	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
 	      -e 's/\.[^.]*$/.X/'
 	exit ;;
     CRAY*TS:*:*:*)
-	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
+	CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+	GUESS=t90-cray-unicos$CRAY_REL
+	;;
     CRAY*T3E:*:*:*)
-	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
+	CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+	GUESS=alphaev5-cray-unicosmk$CRAY_REL
+	;;
     CRAY*SV1:*:*:*)
-	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
+	CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+	GUESS=sv1-cray-unicos$CRAY_REL
+	;;
     *:UNICOS/mp:*:*)
-	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
+	CRAY_REL=`echo "$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/'`
+	GUESS=craynv-cray-unicosmp$CRAY_REL
+	;;
     F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
-	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-	FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
-	echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-	exit ;;
+	FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`
+	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+	FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'`
+	GUESS=${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}
+	;;
     5000:UNIX_System_V:4.*:*)
-	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-	FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
-	echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-	exit ;;
+	FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'`
+	FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'`
+	GUESS=sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}
+	;;
     i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
-	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
-	exit ;;
+	GUESS=$UNAME_MACHINE-pc-bsdi$UNAME_RELEASE
+	;;
     sparc*:BSD/OS:*:*)
-	echo sparc-unknown-bsdi${UNAME_RELEASE}
-	exit ;;
+	GUESS=sparc-unknown-bsdi$UNAME_RELEASE
+	;;
     *:BSD/OS:*:*)
-	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-bsdi$UNAME_RELEASE
+	;;
+    arm:FreeBSD:*:*)
+	UNAME_PROCESSOR=`uname -p`
+	set_cc_for_build
+	if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+	    | grep -q __ARM_PCS_VFP
+	then
+	    FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+	    GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabi
+	else
+	    FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+	    GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL-gnueabihf
+	fi
+	;;
     *:FreeBSD:*:*)
 	UNAME_PROCESSOR=`/usr/bin/uname -p`
-	case ${UNAME_PROCESSOR} in
+	case $UNAME_PROCESSOR in
 	    amd64)
-		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	    *)
-		echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+		UNAME_PROCESSOR=x86_64 ;;
+	    i386)
+		UNAME_PROCESSOR=i586 ;;
 	esac
-	exit ;;
+	FREEBSD_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+	GUESS=$UNAME_PROCESSOR-unknown-freebsd$FREEBSD_REL
+	;;
     i*:CYGWIN*:*)
-	echo ${UNAME_MACHINE}-pc-cygwin
-	exit ;;
+	GUESS=$UNAME_MACHINE-pc-cygwin
+	;;
     *:MINGW64*:*)
-	echo ${UNAME_MACHINE}-pc-mingw64
-	exit ;;
+	GUESS=$UNAME_MACHINE-pc-mingw64
+	;;
     *:MINGW*:*)
-	echo ${UNAME_MACHINE}-pc-mingw32
-	exit ;;
+	GUESS=$UNAME_MACHINE-pc-mingw32
+	;;
     *:MSYS*:*)
-	echo ${UNAME_MACHINE}-pc-msys
-	exit ;;
-    i*:windows32*:*)
-	# uname -m includes "-pc" on this system.
-	echo ${UNAME_MACHINE}-mingw32
-	exit ;;
+	GUESS=$UNAME_MACHINE-pc-msys
+	;;
     i*:PW*:*)
-	echo ${UNAME_MACHINE}-pc-pw32
-	exit ;;
+	GUESS=$UNAME_MACHINE-pc-pw32
+	;;
     *:Interix*:*)
-	case ${UNAME_MACHINE} in
+	case $UNAME_MACHINE in
 	    x86)
-		echo i586-pc-interix${UNAME_RELEASE}
-		exit ;;
+		GUESS=i586-pc-interix$UNAME_RELEASE
+		;;
 	    authenticamd | genuineintel | EM64T)
-		echo x86_64-unknown-interix${UNAME_RELEASE}
-		exit ;;
+		GUESS=x86_64-unknown-interix$UNAME_RELEASE
+		;;
 	    IA64)
-		echo ia64-unknown-interix${UNAME_RELEASE}
-		exit ;;
+		GUESS=ia64-unknown-interix$UNAME_RELEASE
+		;;
 	esac ;;
-    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
-	echo i${UNAME_MACHINE}-pc-mks
-	exit ;;
-    8664:Windows_NT:*)
-	echo x86_64-pc-mks
-	exit ;;
-    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
-	# How do we know it's Interix rather than the generic POSIX subsystem?
-	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
-	# UNAME_MACHINE based on the output of uname instead of i386?
-	echo i586-pc-interix
-	exit ;;
     i*:UWIN*:*)
-	echo ${UNAME_MACHINE}-pc-uwin
-	exit ;;
+	GUESS=$UNAME_MACHINE-pc-uwin
+	;;
     amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
-	echo x86_64-unknown-cygwin
-	exit ;;
-    p*:CYGWIN*:*)
-	echo powerpcle-unknown-cygwin
-	exit ;;
+	GUESS=x86_64-pc-cygwin
+	;;
     prep*:SunOS:5.*:*)
-	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
+	SUN_REL=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`
+	GUESS=powerpcle-unknown-solaris2$SUN_REL
+	;;
     *:GNU:*:*)
 	# the GNU system
-	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
-	exit ;;
+	GNU_ARCH=`echo "$UNAME_MACHINE" | sed -e 's,[-/].*$,,'`
+	GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's,/.*$,,'`
+	GUESS=$GNU_ARCH-unknown-$LIBC$GNU_REL
+	;;
     *:GNU/*:*:*)
 	# other systems with GNU libc and userland
-	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}
-	exit ;;
-    i*86:Minix:*:*)
-	echo ${UNAME_MACHINE}-pc-minix
-	exit ;;
-    aarch64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
+	GNU_SYS=`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"`
+	GNU_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+	GUESS=$UNAME_MACHINE-unknown-$GNU_SYS$GNU_REL-$LIBC
+	;;
+    *:Minix:*:*)
+	GUESS=$UNAME_MACHINE-unknown-minix
+	;;
+    aarch64:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     aarch64_be:Linux:*:*)
 	UNAME_MACHINE=aarch64_be
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     alpha:Linux:*:*)
-	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in
 	  EV5)   UNAME_MACHINE=alphaev5 ;;
 	  EV56)  UNAME_MACHINE=alphaev56 ;;
 	  PCA56) UNAME_MACHINE=alphapca56 ;;
@@ -916,175 +984,226 @@ EOF
 	  EV68*) UNAME_MACHINE=alphaev68 ;;
 	esac
 	objdump --private-headers /bin/sh | grep -q ld.so.1
-	if test "$?" = 0 ; then LIBC="gnulibc1" ; fi
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
-    arc:Linux:*:* | arceb:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
+	if test "$?" = 0 ; then LIBC=gnulibc1 ; fi
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    arc:Linux:*:* | arceb:Linux:*:* | arc32:Linux:*:* | arc64:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     arm*:Linux:*:*)
-	eval $set_cc_for_build
+	set_cc_for_build
 	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
 	    | grep -q __ARM_EABI__
 	then
-	    echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+	    GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
 	else
 	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
 		| grep -q __ARM_PCS_VFP
 	    then
-		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi
+		GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabi
 	    else
-		echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf
+		GUESS=$UNAME_MACHINE-unknown-linux-${LIBC}eabihf
 	    fi
 	fi
-	exit ;;
+	;;
     avr32*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     cris:Linux:*:*)
-	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
-	exit ;;
+	GUESS=$UNAME_MACHINE-axis-linux-$LIBC
+	;;
     crisv32:Linux:*:*)
-	echo ${UNAME_MACHINE}-axis-linux-${LIBC}
-	exit ;;
+	GUESS=$UNAME_MACHINE-axis-linux-$LIBC
+	;;
     e2k:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     frv:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     hexagon:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     i*86:Linux:*:*)
-	echo ${UNAME_MACHINE}-pc-linux-${LIBC}
-	exit ;;
+	GUESS=$UNAME_MACHINE-pc-linux-$LIBC
+	;;
     ia64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    k1om:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
+    loongarch32:Linux:*:* | loongarch64:Linux:*:* | loongarchx32:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     m32r*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     m68*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     mips:Linux:*:* | mips64:Linux:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
+	set_cc_for_build
+	IS_GLIBC=0
+	test x"${LIBC}" = xgnu && IS_GLIBC=1
+	sed 's/^	//' << EOF > "$dummy.c"
 	#undef CPU
-	#undef ${UNAME_MACHINE}
-	#undef ${UNAME_MACHINE}el
+	#undef mips
+	#undef mipsel
+	#undef mips64
+	#undef mips64el
+	#if ${IS_GLIBC} && defined(_ABI64)
+	LIBCABI=gnuabi64
+	#else
+	#if ${IS_GLIBC} && defined(_ABIN32)
+	LIBCABI=gnuabin32
+	#else
+	LIBCABI=${LIBC}
+	#endif
+	#endif
+
+	#if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
+	CPU=mipsisa64r6
+	#else
+	#if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6
+	CPU=mipsisa32r6
+	#else
+	#if defined(__mips64)
+	CPU=mips64
+	#else
+	CPU=mips
+	#endif
+	#endif
+	#endif
+
 	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
-	CPU=${UNAME_MACHINE}el
+	MIPS_ENDIAN=el
 	#else
 	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
-	CPU=${UNAME_MACHINE}
+	MIPS_ENDIAN=
 	#else
-	CPU=
+	MIPS_ENDIAN=
 	#endif
 	#endif
 EOF
-	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
-	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
+	cc_set_vars=`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'`
+	eval "$cc_set_vars"
+	test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; }
+	;;
+    mips64el:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
 	;;
     openrisc*:Linux:*:*)
-	echo or1k-unknown-linux-${LIBC}
-	exit ;;
+	GUESS=or1k-unknown-linux-$LIBC
+	;;
     or32:Linux:*:* | or1k*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     padre:Linux:*:*)
-	echo sparc-unknown-linux-${LIBC}
-	exit ;;
+	GUESS=sparc-unknown-linux-$LIBC
+	;;
     parisc64:Linux:*:* | hppa64:Linux:*:*)
-	echo hppa64-unknown-linux-${LIBC}
-	exit ;;
+	GUESS=hppa64-unknown-linux-$LIBC
+	;;
     parisc:Linux:*:* | hppa:Linux:*:*)
 	# Look for CPU level
 	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
-	  PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;
-	  PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;
-	  *)    echo hppa-unknown-linux-${LIBC} ;;
+	  PA7*) GUESS=hppa1.1-unknown-linux-$LIBC ;;
+	  PA8*) GUESS=hppa2.0-unknown-linux-$LIBC ;;
+	  *)    GUESS=hppa-unknown-linux-$LIBC ;;
 	esac
-	exit ;;
+	;;
     ppc64:Linux:*:*)
-	echo powerpc64-unknown-linux-${LIBC}
-	exit ;;
+	GUESS=powerpc64-unknown-linux-$LIBC
+	;;
     ppc:Linux:*:*)
-	echo powerpc-unknown-linux-${LIBC}
-	exit ;;
+	GUESS=powerpc-unknown-linux-$LIBC
+	;;
     ppc64le:Linux:*:*)
-	echo powerpc64le-unknown-linux-${LIBC}
-	exit ;;
+	GUESS=powerpc64le-unknown-linux-$LIBC
+	;;
     ppcle:Linux:*:*)
-	echo powerpcle-unknown-linux-${LIBC}
-	exit ;;
+	GUESS=powerpcle-unknown-linux-$LIBC
+	;;
+    riscv32:Linux:*:* | riscv32be:Linux:*:* | riscv64:Linux:*:* | riscv64be:Linux:*:*)
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     s390:Linux:*:* | s390x:Linux:*:*)
-	echo ${UNAME_MACHINE}-ibm-linux-${LIBC}
-	exit ;;
+	GUESS=$UNAME_MACHINE-ibm-linux-$LIBC
+	;;
     sh64*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     sh*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     sparc:Linux:*:* | sparc64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     tile*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     vax:Linux:*:*)
-	echo ${UNAME_MACHINE}-dec-linux-${LIBC}
-	exit ;;
+	GUESS=$UNAME_MACHINE-dec-linux-$LIBC
+	;;
     x86_64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
+	set_cc_for_build
+	LIBCABI=$LIBC
+	if test "$CC_FOR_BUILD" != no_compiler_found; then
+	    if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \
+		(CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+		grep IS_X32 >/dev/null
+	    then
+		LIBCABI=${LIBC}x32
+	    fi
+	fi
+	GUESS=$UNAME_MACHINE-pc-linux-$LIBCABI
+	;;
     xtensa*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
+	;;
     i*86:DYNIX/ptx:4*:*)
 	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
 	# earlier versions are messed up and put the nodename in both
 	# sysname and nodename.
-	echo i386-sequent-sysv4
-	exit ;;
+	GUESS=i386-sequent-sysv4
+	;;
     i*86:UNIX_SV:4.2MP:2.*)
 	# Unixware is an offshoot of SVR4, but it has its own version
 	# number series starting with 2...
 	# I am not positive that other SVR4 systems won't match this,
 	# I just have to hope.  -- rms.
 	# Use sysv4.2uw... so that sysv4* matches it.
-	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
-	exit ;;
+	GUESS=$UNAME_MACHINE-pc-sysv4.2uw$UNAME_VERSION
+	;;
     i*86:OS/2:*:*)
 	# If we were able to find `uname', then EMX Unix compatibility
 	# is probably installed.
-	echo ${UNAME_MACHINE}-pc-os2-emx
-	exit ;;
+	GUESS=$UNAME_MACHINE-pc-os2-emx
+	;;
     i*86:XTS-300:*:STOP)
-	echo ${UNAME_MACHINE}-unknown-stop
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-stop
+	;;
     i*86:atheos:*:*)
-	echo ${UNAME_MACHINE}-unknown-atheos
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-atheos
+	;;
     i*86:syllable:*:*)
-	echo ${UNAME_MACHINE}-pc-syllable
-	exit ;;
+	GUESS=$UNAME_MACHINE-pc-syllable
+	;;
     i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
-	echo i386-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
+	GUESS=i386-unknown-lynxos$UNAME_RELEASE
+	;;
     i*86:*DOS:*:*)
-	echo ${UNAME_MACHINE}-pc-msdosdjgpp
-	exit ;;
-    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
-	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+	GUESS=$UNAME_MACHINE-pc-msdosdjgpp
+	;;
+    i*86:*:4.*:*)
+	UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'`
 	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
-		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+		GUESS=$UNAME_MACHINE-univel-sysv$UNAME_REL
 	else
-		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+		GUESS=$UNAME_MACHINE-pc-sysv$UNAME_REL
 	fi
-	exit ;;
+	;;
     i*86:*:5:[678]*)
 	# UnixWare 7.x, OpenUNIX and OpenServer 6.
 	case `/bin/uname -X | grep "^Machine"` in
@@ -1092,12 +1211,12 @@ EOF
 	    *Pentium)	     UNAME_MACHINE=i586 ;;
 	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
 	esac
-	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	;;
     i*86:*:3.2:*)
 	if test -f /usr/options/cb.name; then
 		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
-		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+		GUESS=$UNAME_MACHINE-pc-isc$UNAME_REL
 	elif /bin/uname -X 2>/dev/null >/dev/null ; then
 		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
 		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
@@ -1107,43 +1226,43 @@ EOF
 			&& UNAME_MACHINE=i686
 		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
 			&& UNAME_MACHINE=i686
-		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+		GUESS=$UNAME_MACHINE-pc-sco$UNAME_REL
 	else
-		echo ${UNAME_MACHINE}-pc-sysv32
+		GUESS=$UNAME_MACHINE-pc-sysv32
 	fi
-	exit ;;
+	;;
     pc:*:*:*)
 	# Left here for compatibility:
 	# uname -m prints for DJGPP always 'pc', but it prints nothing about
 	# the processor, so we play safe by assuming i586.
 	# Note: whatever this is, it MUST be the same as what config.sub
-	# prints for the "djgpp" host, or else GDB configury will decide that
+	# prints for the "djgpp" host, or else GDB configure will decide that
 	# this is a cross-build.
-	echo i586-pc-msdosdjgpp
-	exit ;;
+	GUESS=i586-pc-msdosdjgpp
+	;;
     Intel:Mach:3*:*)
-	echo i386-pc-mach3
-	exit ;;
+	GUESS=i386-pc-mach3
+	;;
     paragon:*:*:*)
-	echo i860-intel-osf1
-	exit ;;
+	GUESS=i860-intel-osf1
+	;;
     i860:*:4.*:*) # i860-SVR4
 	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
-	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+	  GUESS=i860-stardent-sysv$UNAME_RELEASE    # Stardent Vistra i860-SVR4
 	else # Add other i860-SVR4 vendors below as they are discovered.
-	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	  GUESS=i860-unknown-sysv$UNAME_RELEASE     # Unknown i860-SVR4
 	fi
-	exit ;;
+	;;
     mini*:CTIX:SYS*5:*)
 	# "miniframe"
-	echo m68010-convergent-sysv
-	exit ;;
+	GUESS=m68010-convergent-sysv
+	;;
     mc68k:UNIX:SYSTEM5:3.51m)
-	echo m68k-convergent-sysv
-	exit ;;
+	GUESS=m68k-convergent-sysv
+	;;
     M680?0:D-NIX:5.3:*)
-	echo m68k-diab-dnix
-	exit ;;
+	GUESS=m68k-diab-dnix
+	;;
     M68*:*:R3V[5678]*:*)
 	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
     3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
@@ -1151,9 +1270,9 @@ EOF
 	test -r /etc/.relid \
 	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
 	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	  && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
 	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
-	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+	  && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
     3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
 	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
 	  && { echo i486-ncr-sysv4; exit; } ;;
@@ -1162,248 +1281,438 @@ EOF
 	test -r /etc/.relid \
 	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
 	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-	    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	    && { echo i486-ncr-sysv4.3"$OS_REL"; exit; }
 	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
-	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
+	    && { echo i586-ncr-sysv4.3"$OS_REL"; exit; }
 	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
-	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+	    && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;;
     m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
-	echo m68k-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
+	GUESS=m68k-unknown-lynxos$UNAME_RELEASE
+	;;
     mc68030:UNIX_System_V:4.*:*)
-	echo m68k-atari-sysv4
-	exit ;;
+	GUESS=m68k-atari-sysv4
+	;;
     TSUNAMI:LynxOS:2.*:*)
-	echo sparc-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
+	GUESS=sparc-unknown-lynxos$UNAME_RELEASE
+	;;
     rs6000:LynxOS:2.*:*)
-	echo rs6000-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
+	GUESS=rs6000-unknown-lynxos$UNAME_RELEASE
+	;;
     PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
-	echo powerpc-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
+	GUESS=powerpc-unknown-lynxos$UNAME_RELEASE
+	;;
     SM[BE]S:UNIX_SV:*:*)
-	echo mips-dde-sysv${UNAME_RELEASE}
-	exit ;;
+	GUESS=mips-dde-sysv$UNAME_RELEASE
+	;;
     RM*:ReliantUNIX-*:*:*)
-	echo mips-sni-sysv4
-	exit ;;
+	GUESS=mips-sni-sysv4
+	;;
     RM*:SINIX-*:*:*)
-	echo mips-sni-sysv4
-	exit ;;
+	GUESS=mips-sni-sysv4
+	;;
     *:SINIX-*:*:*)
 	if uname -p 2>/dev/null >/dev/null ; then
 		UNAME_MACHINE=`(uname -p) 2>/dev/null`
-		echo ${UNAME_MACHINE}-sni-sysv4
+		GUESS=$UNAME_MACHINE-sni-sysv4
 	else
-		echo ns32k-sni-sysv
+		GUESS=ns32k-sni-sysv
 	fi
-	exit ;;
+	;;
     PENTIUM:*:4.0*:*)	# Unisys `ClearPath HMP IX 4000' SVR4/MP effort
 			# says <Richard.M.Bartel@ccMail.Census.GOV>
-	echo i586-unisys-sysv4
-	exit ;;
+	GUESS=i586-unisys-sysv4
+	;;
     *:UNIX_System_V:4*:FTX*)
 	# From Gerald Hewes <hewes@openmarket.com>.
 	# How about differentiating between stratus architectures? -djm
-	echo hppa1.1-stratus-sysv4
-	exit ;;
+	GUESS=hppa1.1-stratus-sysv4
+	;;
     *:*:*:FTX*)
 	# From seanf@swdc.stratus.com.
-	echo i860-stratus-sysv4
-	exit ;;
+	GUESS=i860-stratus-sysv4
+	;;
     i*86:VOS:*:*)
 	# From Paul.Green@stratus.com.
-	echo ${UNAME_MACHINE}-stratus-vos
-	exit ;;
+	GUESS=$UNAME_MACHINE-stratus-vos
+	;;
     *:VOS:*:*)
 	# From Paul.Green@stratus.com.
-	echo hppa1.1-stratus-vos
-	exit ;;
+	GUESS=hppa1.1-stratus-vos
+	;;
     mc68*:A/UX:*:*)
-	echo m68k-apple-aux${UNAME_RELEASE}
-	exit ;;
+	GUESS=m68k-apple-aux$UNAME_RELEASE
+	;;
     news*:NEWS-OS:6*:*)
-	echo mips-sony-newsos6
-	exit ;;
+	GUESS=mips-sony-newsos6
+	;;
     R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
-	if [ -d /usr/nec ]; then
-		echo mips-nec-sysv${UNAME_RELEASE}
+	if test -d /usr/nec; then
+		GUESS=mips-nec-sysv$UNAME_RELEASE
 	else
-		echo mips-unknown-sysv${UNAME_RELEASE}
+		GUESS=mips-unknown-sysv$UNAME_RELEASE
 	fi
-	exit ;;
+	;;
     BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
-	echo powerpc-be-beos
-	exit ;;
+	GUESS=powerpc-be-beos
+	;;
     BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
-	echo powerpc-apple-beos
-	exit ;;
+	GUESS=powerpc-apple-beos
+	;;
     BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
-	echo i586-pc-beos
-	exit ;;
+	GUESS=i586-pc-beos
+	;;
     BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
-	echo i586-pc-haiku
-	exit ;;
+	GUESS=i586-pc-haiku
+	;;
     x86_64:Haiku:*:*)
-	echo x86_64-unknown-haiku
-	exit ;;
+	GUESS=x86_64-unknown-haiku
+	;;
     SX-4:SUPER-UX:*:*)
-	echo sx4-nec-superux${UNAME_RELEASE}
-	exit ;;
+	GUESS=sx4-nec-superux$UNAME_RELEASE
+	;;
     SX-5:SUPER-UX:*:*)
-	echo sx5-nec-superux${UNAME_RELEASE}
-	exit ;;
+	GUESS=sx5-nec-superux$UNAME_RELEASE
+	;;
     SX-6:SUPER-UX:*:*)
-	echo sx6-nec-superux${UNAME_RELEASE}
-	exit ;;
+	GUESS=sx6-nec-superux$UNAME_RELEASE
+	;;
     SX-7:SUPER-UX:*:*)
-	echo sx7-nec-superux${UNAME_RELEASE}
-	exit ;;
+	GUESS=sx7-nec-superux$UNAME_RELEASE
+	;;
     SX-8:SUPER-UX:*:*)
-	echo sx8-nec-superux${UNAME_RELEASE}
-	exit ;;
+	GUESS=sx8-nec-superux$UNAME_RELEASE
+	;;
     SX-8R:SUPER-UX:*:*)
-	echo sx8r-nec-superux${UNAME_RELEASE}
-	exit ;;
+	GUESS=sx8r-nec-superux$UNAME_RELEASE
+	;;
+    SX-ACE:SUPER-UX:*:*)
+	GUESS=sxace-nec-superux$UNAME_RELEASE
+	;;
     Power*:Rhapsody:*:*)
-	echo powerpc-apple-rhapsody${UNAME_RELEASE}
-	exit ;;
+	GUESS=powerpc-apple-rhapsody$UNAME_RELEASE
+	;;
     *:Rhapsody:*:*)
-	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
-	exit ;;
+	GUESS=$UNAME_MACHINE-apple-rhapsody$UNAME_RELEASE
+	;;
+    arm64:Darwin:*:*)
+	GUESS=aarch64-apple-darwin$UNAME_RELEASE
+	;;
     *:Darwin:*:*)
-	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
-	eval $set_cc_for_build
-	if test "$UNAME_PROCESSOR" = unknown ; then
-	    UNAME_PROCESSOR=powerpc
+	UNAME_PROCESSOR=`uname -p`
+	case $UNAME_PROCESSOR in
+	    unknown) UNAME_PROCESSOR=powerpc ;;
+	esac
+	if command -v xcode-select > /dev/null 2> /dev/null && \
+		! xcode-select --print-path > /dev/null 2> /dev/null ; then
+	    # Avoid executing cc if there is no toolchain installed as
+	    # cc will be a stub that puts up a graphical alert
+	    # prompting the user to install developer tools.
+	    CC_FOR_BUILD=no_compiler_found
+	else
+	    set_cc_for_build
 	fi
-	if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then
-	    if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
-		if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
-		    (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
-		    grep IS_64BIT_ARCH >/dev/null
-		then
-		    case $UNAME_PROCESSOR in
-			i386) UNAME_PROCESSOR=x86_64 ;;
-			powerpc) UNAME_PROCESSOR=powerpc64 ;;
-		    esac
-		fi
+	if test "$CC_FOR_BUILD" != no_compiler_found; then
+	    if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+		   (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+		   grep IS_64BIT_ARCH >/dev/null
+	    then
+		case $UNAME_PROCESSOR in
+		    i386) UNAME_PROCESSOR=x86_64 ;;
+		    powerpc) UNAME_PROCESSOR=powerpc64 ;;
+		esac
+	    fi
+	    # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc
+	    if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \
+		   (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \
+		   grep IS_PPC >/dev/null
+	    then
+		UNAME_PROCESSOR=powerpc
 	    fi
 	elif test "$UNAME_PROCESSOR" = i386 ; then
-	    # Avoid executing cc on OS X 10.9, as it ships with a stub
-	    # that puts up a graphical alert prompting to install
-	    # developer tools.  Any system running Mac OS X 10.7 or
-	    # later (Darwin 11 and later) is required to have a 64-bit
-	    # processor. This is not true of the ARM version of Darwin
-	    # that Apple uses in portable devices.
-	    UNAME_PROCESSOR=x86_64
+	    # uname -m returns i386 or x86_64
+	    UNAME_PROCESSOR=$UNAME_MACHINE
 	fi
-	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
-	exit ;;
+	GUESS=$UNAME_PROCESSOR-apple-darwin$UNAME_RELEASE
+	;;
     *:procnto*:*:* | *:QNX:[0123456789]*:*)
 	UNAME_PROCESSOR=`uname -p`
-	if test "$UNAME_PROCESSOR" = "x86"; then
+	if test "$UNAME_PROCESSOR" = x86; then
 		UNAME_PROCESSOR=i386
 		UNAME_MACHINE=pc
 	fi
-	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
-	exit ;;
+	GUESS=$UNAME_PROCESSOR-$UNAME_MACHINE-nto-qnx$UNAME_RELEASE
+	;;
     *:QNX:*:4*)
-	echo i386-pc-qnx
-	exit ;;
-    NEO-?:NONSTOP_KERNEL:*:*)
-	echo neo-tandem-nsk${UNAME_RELEASE}
-	exit ;;
+	GUESS=i386-pc-qnx
+	;;
+    NEO-*:NONSTOP_KERNEL:*:*)
+	GUESS=neo-tandem-nsk$UNAME_RELEASE
+	;;
     NSE-*:NONSTOP_KERNEL:*:*)
-	echo nse-tandem-nsk${UNAME_RELEASE}
-	exit ;;
-    NSR-?:NONSTOP_KERNEL:*:*)
-	echo nsr-tandem-nsk${UNAME_RELEASE}
-	exit ;;
+	GUESS=nse-tandem-nsk$UNAME_RELEASE
+	;;
+    NSR-*:NONSTOP_KERNEL:*:*)
+	GUESS=nsr-tandem-nsk$UNAME_RELEASE
+	;;
+    NSV-*:NONSTOP_KERNEL:*:*)
+	GUESS=nsv-tandem-nsk$UNAME_RELEASE
+	;;
+    NSX-*:NONSTOP_KERNEL:*:*)
+	GUESS=nsx-tandem-nsk$UNAME_RELEASE
+	;;
     *:NonStop-UX:*:*)
-	echo mips-compaq-nonstopux
-	exit ;;
+	GUESS=mips-compaq-nonstopux
+	;;
     BS2000:POSIX*:*:*)
-	echo bs2000-siemens-sysv
-	exit ;;
+	GUESS=bs2000-siemens-sysv
+	;;
     DS/*:UNIX_System_V:*:*)
-	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
-	exit ;;
+	GUESS=$UNAME_MACHINE-$UNAME_SYSTEM-$UNAME_RELEASE
+	;;
     *:Plan9:*:*)
 	# "uname -m" is not consistent, so use $cputype instead. 386
 	# is converted to i386 for consistency with other x86
 	# operating systems.
-	if test "$cputype" = "386"; then
+	if test "${cputype-}" = 386; then
 	    UNAME_MACHINE=i386
-	else
-	    UNAME_MACHINE="$cputype"
+	elif test "x${cputype-}" != x; then
+	    UNAME_MACHINE=$cputype
 	fi
-	echo ${UNAME_MACHINE}-unknown-plan9
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-plan9
+	;;
     *:TOPS-10:*:*)
-	echo pdp10-unknown-tops10
-	exit ;;
+	GUESS=pdp10-unknown-tops10
+	;;
     *:TENEX:*:*)
-	echo pdp10-unknown-tenex
-	exit ;;
+	GUESS=pdp10-unknown-tenex
+	;;
     KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
-	echo pdp10-dec-tops20
-	exit ;;
+	GUESS=pdp10-dec-tops20
+	;;
     XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
-	echo pdp10-xkl-tops20
-	exit ;;
+	GUESS=pdp10-xkl-tops20
+	;;
     *:TOPS-20:*:*)
-	echo pdp10-unknown-tops20
-	exit ;;
+	GUESS=pdp10-unknown-tops20
+	;;
     *:ITS:*:*)
-	echo pdp10-unknown-its
-	exit ;;
+	GUESS=pdp10-unknown-its
+	;;
     SEI:*:*:SEIUX)
-	echo mips-sei-seiux${UNAME_RELEASE}
-	exit ;;
+	GUESS=mips-sei-seiux$UNAME_RELEASE
+	;;
     *:DragonFly:*:*)
-	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
-	exit ;;
+	DRAGONFLY_REL=`echo "$UNAME_RELEASE" | sed -e 's/[-(].*//'`
+	GUESS=$UNAME_MACHINE-unknown-dragonfly$DRAGONFLY_REL
+	;;
     *:*VMS:*:*)
 	UNAME_MACHINE=`(uname -p) 2>/dev/null`
-	case "${UNAME_MACHINE}" in
-	    A*) echo alpha-dec-vms ; exit ;;
-	    I*) echo ia64-dec-vms ; exit ;;
-	    V*) echo vax-dec-vms ; exit ;;
+	case $UNAME_MACHINE in
+	    A*) GUESS=alpha-dec-vms ;;
+	    I*) GUESS=ia64-dec-vms ;;
+	    V*) GUESS=vax-dec-vms ;;
 	esac ;;
     *:XENIX:*:SysV)
-	echo i386-pc-xenix
-	exit ;;
+	GUESS=i386-pc-xenix
+	;;
     i*86:skyos:*:*)
-	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
-	exit ;;
+	SKYOS_REL=`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`
+	GUESS=$UNAME_MACHINE-pc-skyos$SKYOS_REL
+	;;
     i*86:rdos:*:*)
-	echo ${UNAME_MACHINE}-pc-rdos
-	exit ;;
-    i*86:AROS:*:*)
-	echo ${UNAME_MACHINE}-pc-aros
-	exit ;;
+	GUESS=$UNAME_MACHINE-pc-rdos
+	;;
+    *:AROS:*:*)
+	GUESS=$UNAME_MACHINE-unknown-aros
+	;;
     x86_64:VMkernel:*:*)
-	echo ${UNAME_MACHINE}-unknown-esx
-	exit ;;
+	GUESS=$UNAME_MACHINE-unknown-esx
+	;;
+    amd64:Isilon\ OneFS:*:*)
+	GUESS=x86_64-unknown-onefs
+	;;
+    *:Unleashed:*:*)
+	GUESS=$UNAME_MACHINE-unknown-unleashed$UNAME_RELEASE
+	;;
+esac
+
+# Do we have a guess based on uname results?
+if test "x$GUESS" != x; then
+    echo "$GUESS"
+    exit
+fi
+
+# No uname command or uname output not recognized.
+set_cc_for_build
+cat > "$dummy.c" <<EOF
+#ifdef _SEQUENT_
+#include <sys/types.h>
+#include <sys/utsname.h>
+#endif
+#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
+#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
+#include <signal.h>
+#if defined(_SIZE_T_) || defined(SIGLOST)
+#include <sys/utsname.h>
+#endif
+#endif
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+  "4"
+#else
+  ""
+#endif
+  ); exit (0);
+#endif
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+  struct utsname un;
+
+  uname(&un);
+  if (strncmp(un.version, "V2", 2) == 0) {
+    printf ("i386-sequent-ptx2\n"); exit (0);
+  }
+  if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+    printf ("i386-sequent-ptx1\n"); exit (0);
+  }
+  printf ("i386-sequent-ptx\n"); exit (0);
+#endif
+
+#if defined (vax)
+#if !defined (ultrix)
+#include <sys/param.h>
+#if defined (BSD)
+#if BSD == 43
+  printf ("vax-dec-bsd4.3\n"); exit (0);
+#else
+#if BSD == 199006
+  printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#else
+  printf ("vax-dec-bsd\n"); exit (0);
+#endif
+#endif
+#else
+  printf ("vax-dec-bsd\n"); exit (0);
+#endif
+#else
+#if defined(_SIZE_T_) || defined(SIGLOST)
+  struct utsname un;
+  uname (&un);
+  printf ("vax-dec-ultrix%s\n", un.release); exit (0);
+#else
+  printf ("vax-dec-ultrix\n"); exit (0);
+#endif
+#endif
+#endif
+#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__)
+#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__)
+#if defined(_SIZE_T_) || defined(SIGLOST)
+  struct utsname *un;
+  uname (&un);
+  printf ("mips-dec-ultrix%s\n", un.release); exit (0);
+#else
+  printf ("mips-dec-ultrix\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`"$dummy"` &&
+	{ echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; }
+
+echo "$0: unable to guess system type" >&2
+
+case $UNAME_MACHINE:$UNAME_SYSTEM in
+    mips:Linux | mips64:Linux)
+	# If we got here on MIPS GNU/Linux, output extra information.
+	cat >&2 <<EOF
+
+NOTE: MIPS GNU/Linux systems require a C compiler to fully recognize
+the system type. Please install a C compiler and try again.
+EOF
+	;;
 esac
 
 cat >&2 <<EOF
-$0: unable to guess system type
 
-This script, last modified $timestamp, has failed to recognize
-the operating system you are using. It is advised that you
-download the most up to date version of the config scripts from
+This script (version $timestamp), has failed to recognize the
+operating system you are using. If your script is old, overwrite *all*
+copies of config.guess and config.sub with the latest versions from:
 
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+  https://git.savannah.gnu.org/cgit/config.git/plain/config.guess
 and
-  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+  https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
+EOF
 
-If the version you run ($0) is already up to date, please
-send the following data and any information you think might be
-pertinent to <config-patches@gnu.org> in order to provide the needed
-information to handle your system.
+our_year=`echo $timestamp | sed 's,-.*,,'`
+thisyear=`date +%Y`
+# shellcheck disable=SC2003
+script_age=`expr "$thisyear" - "$our_year"`
+if test "$script_age" -lt 3 ; then
+   cat >&2 <<EOF
+
+If $0 has already been updated, send the following data and any
+information you think might be pertinent to config-patches@gnu.org to
+provide the necessary information to handle your system.
 
 config.guess timestamp = $timestamp
 
@@ -1422,16 +1731,17 @@ hostinfo               = `(hostinfo) 2>/dev/null`
 /usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
 /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
 
-UNAME_MACHINE = ${UNAME_MACHINE}
-UNAME_RELEASE = ${UNAME_RELEASE}
-UNAME_SYSTEM  = ${UNAME_SYSTEM}
-UNAME_VERSION = ${UNAME_VERSION}
+UNAME_MACHINE = "$UNAME_MACHINE"
+UNAME_RELEASE = "$UNAME_RELEASE"
+UNAME_SYSTEM  = "$UNAME_SYSTEM"
+UNAME_VERSION = "$UNAME_VERSION"
 EOF
+fi
 
 exit 1
 
 # Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
+# eval: (add-hook 'before-save-hook 'time-stamp)
 # time-stamp-start: "timestamp='"
 # time-stamp-format: "%:y-%02m-%02d"
 # time-stamp-end: "'"
diff --git a/autoconf/config.sub b/autoconf/config.sub
@@ -1,8 +1,10 @@
 #! /bin/sh
 # Configuration validation subroutine script.
-#   Copyright 1992-2015 Free Software Foundation, Inc.
+#   Copyright 1992-2021 Free Software Foundation, Inc.
 
-timestamp='2015-03-08'
+# shellcheck disable=SC2006,SC2268 # see below for rationale
+
+timestamp='2021-08-14'
 
 # This file is free software; you can redistribute it and/or modify it
 # under the terms of the GNU General Public License as published by
@@ -15,7 +17,7 @@ timestamp='2015-03-08'
 # General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
-# along with this program; if not, see <http://www.gnu.org/licenses/>.
+# along with this program; if not, see <https://www.gnu.org/licenses/>.
 #
 # As a special exception to the GNU General Public License, if you
 # distribute this file as part of a program that contains a
@@ -33,7 +35,7 @@ timestamp='2015-03-08'
 # Otherwise, we print the canonical config type on stdout and succeed.
 
 # You can get the latest version of this script from:
-# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+# https://git.savannah.gnu.org/cgit/config.git/plain/config.sub
 
 # This file is supposed to be the same for all GNU packages
 # and recognize all the CPU types, system types and aliases
@@ -50,15 +52,21 @@ timestamp='2015-03-08'
 #	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
 # It is wrong to echo any other type of specification.
 
+# The "shellcheck disable" line above the timestamp inhibits complaints
+# about features and limitations of the classic Bourne shell that were
+# superseded or lifted in POSIX.  However, this script identifies a wide
+# variety of pre-POSIX systems that do not have POSIX shells at all, and
+# even some reasonably current systems (Solaris 10 as case-in-point) still
+# have a pre-POSIX /bin/sh.
+
 me=`echo "$0" | sed -e 's,.*/,,'`
 
 usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS
-       $0 [OPTION] ALIAS
+Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS
 
 Canonicalize a configuration name.
 
-Operation modes:
+Options:
   -h, --help         print this help, then exit
   -t, --time-stamp   print date of last modification, then exit
   -v, --version      print version number, then exit
@@ -68,7 +76,7 @@ Report bugs and patches to <config-patches@gnu.org>."
 version="\
 GNU config.sub ($timestamp)
 
-Copyright 1992-2015 Free Software Foundation, Inc.
+Copyright 1992-2021 Free Software Foundation, Inc.
 
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -90,12 +98,12 @@ while test $# -gt 0 ; do
     - )	# Use stdin as input.
        break ;;
     -* )
-       echo "$me: invalid option $1$help"
+       echo "$me: invalid option $1$help" >&2
        exit 1 ;;
 
     *local*)
        # First pass through any local machine types.
-       echo $1
+       echo "$1"
        exit ;;
 
     * )
@@ -111,1231 +119,1181 @@ case $# in
     exit 1;;
 esac
 
-# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
-# Here we must recognize all the valid KERNEL-OS combinations.
-maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
-case $maybe_os in
-  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
-  linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
-  knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
-  kopensolaris*-gnu* | \
-  storm-chaos* | os2-emx* | rtmk-nova*)
-    os=-$maybe_os
-    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
-    ;;
-  android-linux)
-    os=-linux-android
-    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
-    ;;
-  *)
-    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
-    if [ $basic_machine != $1 ]
-    then os=`echo $1 | sed 's/.*-/-/'`
-    else os=; fi
-    ;;
-esac
+# Split fields of configuration type
+# shellcheck disable=SC2162
+saved_IFS=$IFS
+IFS="-" read field1 field2 field3 field4 <<EOF
+$1
+EOF
+IFS=$saved_IFS
 
-### Let's recognize common machines as not being operating systems so
-### that things like config.sub decstation-3100 work.  We also
-### recognize some manufacturers as not being operating systems, so we
-### can provide default operating systems below.
-case $os in
-	-sun*os*)
-		# Prevent following clause from handling this invalid input.
-		;;
-	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
-	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
-	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
-	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
-	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
-	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-	-apple | -axis | -knuth | -cray | -microblaze*)
-		os=
-		basic_machine=$1
-		;;
-	-bluegene*)
-		os=-cnk
-		;;
-	-sim | -cisco | -oki | -wec | -winbond)
-		os=
-		basic_machine=$1
-		;;
-	-scout)
-		;;
-	-wrs)
-		os=-vxworks
-		basic_machine=$1
-		;;
-	-chorusos*)
-		os=-chorusos
-		basic_machine=$1
-		;;
-	-chorusrdb)
-		os=-chorusrdb
-		basic_machine=$1
-		;;
-	-hiux*)
-		os=-hiuxwe2
-		;;
-	-sco6)
-		os=-sco5v6
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco5)
-		os=-sco3.2v5
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco4)
-		os=-sco3.2v4
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco3.2.[4-9]*)
-		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco3.2v[4-9]*)
-		# Don't forget version if it is 3.2v4 or newer.
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco5v6*)
-		# Don't forget version if it is 3.2v4 or newer.
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco*)
-		os=-sco3.2v2
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-udk*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-isc)
-		os=-isc2.2
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-clix*)
-		basic_machine=clipper-intergraph
-		;;
-	-isc*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-lynx*178)
-		os=-lynxos178
-		;;
-	-lynx*5)
-		os=-lynxos5
-		;;
-	-lynx*)
-		os=-lynxos
+# Separate into logical components for further validation
+case $1 in
+	*-*-*-*-*)
+		echo Invalid configuration \`"$1"\': more than four components >&2
+		exit 1
 		;;
-	-ptx*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+	*-*-*-*)
+		basic_machine=$field1-$field2
+		basic_os=$field3-$field4
 		;;
-	-windowsnt*)
-		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+	*-*-*)
+		# Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two
+		# parts
+		maybe_os=$field2-$field3
+		case $maybe_os in
+			nto-qnx* | linux-* | uclinux-uclibc* \
+			| uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \
+			| netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \
+			| storm-chaos* | os2-emx* | rtmk-nova*)
+				basic_machine=$field1
+				basic_os=$maybe_os
+				;;
+			android-linux)
+				basic_machine=$field1-unknown
+				basic_os=linux-android
+				;;
+			*)
+				basic_machine=$field1-$field2
+				basic_os=$field3
+				;;
+		esac
 		;;
-	-psos*)
-		os=-psos
+	*-*)
+		# A lone config we happen to match not fitting any pattern
+		case $field1-$field2 in
+			decstation-3100)
+				basic_machine=mips-dec
+				basic_os=
+				;;
+			*-*)
+				# Second component is usually, but not always the OS
+				case $field2 in
+					# Prevent following clause from handling this valid os
+					sun*os*)
+						basic_machine=$field1
+						basic_os=$field2
+						;;
+					zephyr*)
+						basic_machine=$field1-unknown
+						basic_os=$field2
+						;;
+					# Manufacturers
+					dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \
+					| att* | 7300* | 3300* | delta* | motorola* | sun[234]* \
+					| unicom* | ibm* | next | hp | isi* | apollo | altos* \
+					| convergent* | ncr* | news | 32* | 3600* | 3100* \
+					| hitachi* | c[123]* | convex* | sun | crds | omron* | dg \
+					| ultra | tti* | harris | dolphin | highlevel | gould \
+					| cbm | ns | masscomp | apple | axis | knuth | cray \
+					| microblaze* | sim | cisco \
+					| oki | wec | wrs | winbond)
+						basic_machine=$field1-$field2
+						basic_os=
+						;;
+					*)
+						basic_machine=$field1
+						basic_os=$field2
+						;;
+				esac
+			;;
+		esac
 		;;
-	-mint | -mint[0-9]*)
-		basic_machine=m68k-atari
-		os=-mint
+	*)
+		# Convert single-component short-hands not valid as part of
+		# multi-component configurations.
+		case $field1 in
+			386bsd)
+				basic_machine=i386-pc
+				basic_os=bsd
+				;;
+			a29khif)
+				basic_machine=a29k-amd
+				basic_os=udi
+				;;
+			adobe68k)
+				basic_machine=m68010-adobe
+				basic_os=scout
+				;;
+			alliant)
+				basic_machine=fx80-alliant
+				basic_os=
+				;;
+			altos | altos3068)
+				basic_machine=m68k-altos
+				basic_os=
+				;;
+			am29k)
+				basic_machine=a29k-none
+				basic_os=bsd
+				;;
+			amdahl)
+				basic_machine=580-amdahl
+				basic_os=sysv
+				;;
+			amiga)
+				basic_machine=m68k-unknown
+				basic_os=
+				;;
+			amigaos | amigados)
+				basic_machine=m68k-unknown
+				basic_os=amigaos
+				;;
+			amigaunix | amix)
+				basic_machine=m68k-unknown
+				basic_os=sysv4
+				;;
+			apollo68)
+				basic_machine=m68k-apollo
+				basic_os=sysv
+				;;
+			apollo68bsd)
+				basic_machine=m68k-apollo
+				basic_os=bsd
+				;;
+			aros)
+				basic_machine=i386-pc
+				basic_os=aros
+				;;
+			aux)
+				basic_machine=m68k-apple
+				basic_os=aux
+				;;
+			balance)
+				basic_machine=ns32k-sequent
+				basic_os=dynix
+				;;
+			blackfin)
+				basic_machine=bfin-unknown
+				basic_os=linux
+				;;
+			cegcc)
+				basic_machine=arm-unknown
+				basic_os=cegcc
+				;;
+			convex-c1)
+				basic_machine=c1-convex
+				basic_os=bsd
+				;;
+			convex-c2)
+				basic_machine=c2-convex
+				basic_os=bsd
+				;;
+			convex-c32)
+				basic_machine=c32-convex
+				basic_os=bsd
+				;;
+			convex-c34)
+				basic_machine=c34-convex
+				basic_os=bsd
+				;;
+			convex-c38)
+				basic_machine=c38-convex
+				basic_os=bsd
+				;;
+			cray)
+				basic_machine=j90-cray
+				basic_os=unicos
+				;;
+			crds | unos)
+				basic_machine=m68k-crds
+				basic_os=
+				;;
+			da30)
+				basic_machine=m68k-da30
+				basic_os=
+				;;
+			decstation | pmax | pmin | dec3100 | decstatn)
+				basic_machine=mips-dec
+				basic_os=
+				;;
+			delta88)
+				basic_machine=m88k-motorola
+				basic_os=sysv3
+				;;
+			dicos)
+				basic_machine=i686-pc
+				basic_os=dicos
+				;;
+			djgpp)
+				basic_machine=i586-pc
+				basic_os=msdosdjgpp
+				;;
+			ebmon29k)
+				basic_machine=a29k-amd
+				basic_os=ebmon
+				;;
+			es1800 | OSE68k | ose68k | ose | OSE)
+				basic_machine=m68k-ericsson
+				basic_os=ose
+				;;
+			gmicro)
+				basic_machine=tron-gmicro
+				basic_os=sysv
+				;;
+			go32)
+				basic_machine=i386-pc
+				basic_os=go32
+				;;
+			h8300hms)
+				basic_machine=h8300-hitachi
+				basic_os=hms
+				;;
+			h8300xray)
+				basic_machine=h8300-hitachi
+				basic_os=xray
+				;;
+			h8500hms)
+				basic_machine=h8500-hitachi
+				basic_os=hms
+				;;
+			harris)
+				basic_machine=m88k-harris
+				basic_os=sysv3
+				;;
+			hp300 | hp300hpux)
+				basic_machine=m68k-hp
+				basic_os=hpux
+				;;
+			hp300bsd)
+				basic_machine=m68k-hp
+				basic_os=bsd
+				;;
+			hppaosf)
+				basic_machine=hppa1.1-hp
+				basic_os=osf
+				;;
+			hppro)
+				basic_machine=hppa1.1-hp
+				basic_os=proelf
+				;;
+			i386mach)
+				basic_machine=i386-mach
+				basic_os=mach
+				;;
+			isi68 | isi)
+				basic_machine=m68k-isi
+				basic_os=sysv
+				;;
+			m68knommu)
+				basic_machine=m68k-unknown
+				basic_os=linux
+				;;
+			magnum | m3230)
+				basic_machine=mips-mips
+				basic_os=sysv
+				;;
+			merlin)
+				basic_machine=ns32k-utek
+				basic_os=sysv
+				;;
+			mingw64)
+				basic_machine=x86_64-pc
+				basic_os=mingw64
+				;;
+			mingw32)
+				basic_machine=i686-pc
+				basic_os=mingw32
+				;;
+			mingw32ce)
+				basic_machine=arm-unknown
+				basic_os=mingw32ce
+				;;
+			monitor)
+				basic_machine=m68k-rom68k
+				basic_os=coff
+				;;
+			morphos)
+				basic_machine=powerpc-unknown
+				basic_os=morphos
+				;;
+			moxiebox)
+				basic_machine=moxie-unknown
+				basic_os=moxiebox
+				;;
+			msdos)
+				basic_machine=i386-pc
+				basic_os=msdos
+				;;
+			msys)
+				basic_machine=i686-pc
+				basic_os=msys
+				;;
+			mvs)
+				basic_machine=i370-ibm
+				basic_os=mvs
+				;;
+			nacl)
+				basic_machine=le32-unknown
+				basic_os=nacl
+				;;
+			ncr3000)
+				basic_machine=i486-ncr
+				basic_os=sysv4
+				;;
+			netbsd386)
+				basic_machine=i386-pc
+				basic_os=netbsd
+				;;
+			netwinder)
+				basic_machine=armv4l-rebel
+				basic_os=linux
+				;;
+			news | news700 | news800 | news900)
+				basic_machine=m68k-sony
+				basic_os=newsos
+				;;
+			news1000)
+				basic_machine=m68030-sony
+				basic_os=newsos
+				;;
+			necv70)
+				basic_machine=v70-nec
+				basic_os=sysv
+				;;
+			nh3000)
+				basic_machine=m68k-harris
+				basic_os=cxux
+				;;
+			nh[45]000)
+				basic_machine=m88k-harris
+				basic_os=cxux
+				;;
+			nindy960)
+				basic_machine=i960-intel
+				basic_os=nindy
+				;;
+			mon960)
+				basic_machine=i960-intel
+				basic_os=mon960
+				;;
+			nonstopux)
+				basic_machine=mips-compaq
+				basic_os=nonstopux
+				;;
+			os400)
+				basic_machine=powerpc-ibm
+				basic_os=os400
+				;;
+			OSE68000 | ose68000)
+				basic_machine=m68000-ericsson
+				basic_os=ose
+				;;
+			os68k)
+				basic_machine=m68k-none
+				basic_os=os68k
+				;;
+			paragon)
+				basic_machine=i860-intel
+				basic_os=osf
+				;;
+			parisc)
+				basic_machine=hppa-unknown
+				basic_os=linux
+				;;
+			psp)
+				basic_machine=mipsallegrexel-sony
+				basic_os=psp
+				;;
+			pw32)
+				basic_machine=i586-unknown
+				basic_os=pw32
+				;;
+			rdos | rdos64)
+				basic_machine=x86_64-pc
+				basic_os=rdos
+				;;
+			rdos32)
+				basic_machine=i386-pc
+				basic_os=rdos
+				;;
+			rom68k)
+				basic_machine=m68k-rom68k
+				basic_os=coff
+				;;
+			sa29200)
+				basic_machine=a29k-amd
+				basic_os=udi
+				;;
+			sei)
+				basic_machine=mips-sei
+				basic_os=seiux
+				;;
+			sequent)
+				basic_machine=i386-sequent
+				basic_os=
+				;;
+			sps7)
+				basic_machine=m68k-bull
+				basic_os=sysv2
+				;;
+			st2000)
+				basic_machine=m68k-tandem
+				basic_os=
+				;;
+			stratus)
+				basic_machine=i860-stratus
+				basic_os=sysv4
+				;;
+			sun2)
+				basic_machine=m68000-sun
+				basic_os=
+				;;
+			sun2os3)
+				basic_machine=m68000-sun
+				basic_os=sunos3
+				;;
+			sun2os4)
+				basic_machine=m68000-sun
+				basic_os=sunos4
+				;;
+			sun3)
+				basic_machine=m68k-sun
+				basic_os=
+				;;
+			sun3os3)
+				basic_machine=m68k-sun
+				basic_os=sunos3
+				;;
+			sun3os4)
+				basic_machine=m68k-sun
+				basic_os=sunos4
+				;;
+			sun4)
+				basic_machine=sparc-sun
+				basic_os=
+				;;
+			sun4os3)
+				basic_machine=sparc-sun
+				basic_os=sunos3
+				;;
+			sun4os4)
+				basic_machine=sparc-sun
+				basic_os=sunos4
+				;;
+			sun4sol2)
+				basic_machine=sparc-sun
+				basic_os=solaris2
+				;;
+			sun386 | sun386i | roadrunner)
+				basic_machine=i386-sun
+				basic_os=
+				;;
+			sv1)
+				basic_machine=sv1-cray
+				basic_os=unicos
+				;;
+			symmetry)
+				basic_machine=i386-sequent
+				basic_os=dynix
+				;;
+			t3e)
+				basic_machine=alphaev5-cray
+				basic_os=unicos
+				;;
+			t90)
+				basic_machine=t90-cray
+				basic_os=unicos
+				;;
+			toad1)
+				basic_machine=pdp10-xkl
+				basic_os=tops20
+				;;
+			tpf)
+				basic_machine=s390x-ibm
+				basic_os=tpf
+				;;
+			udi29k)
+				basic_machine=a29k-amd
+				basic_os=udi
+				;;
+			ultra3)
+				basic_machine=a29k-nyu
+				basic_os=sym1
+				;;
+			v810 | necv810)
+				basic_machine=v810-nec
+				basic_os=none
+				;;
+			vaxv)
+				basic_machine=vax-dec
+				basic_os=sysv
+				;;
+			vms)
+				basic_machine=vax-dec
+				basic_os=vms
+				;;
+			vsta)
+				basic_machine=i386-pc
+				basic_os=vsta
+				;;
+			vxworks960)
+				basic_machine=i960-wrs
+				basic_os=vxworks
+				;;
+			vxworks68)
+				basic_machine=m68k-wrs
+				basic_os=vxworks
+				;;
+			vxworks29k)
+				basic_machine=a29k-wrs
+				basic_os=vxworks
+				;;
+			xbox)
+				basic_machine=i686-pc
+				basic_os=mingw32
+				;;
+			ymp)
+				basic_machine=ymp-cray
+				basic_os=unicos
+				;;
+			*)
+				basic_machine=$1
+				basic_os=
+				;;
+		esac
 		;;
 esac
 
-# Decode aliases for certain CPU-COMPANY combinations.
+# Decode 1-component or ad-hoc basic machines
 case $basic_machine in
-	# Recognize the basic CPU types without company name.
-	# Some are omitted here because they have special meanings below.
-	1750a | 580 \
-	| a29k \
-	| aarch64 | aarch64_be \
-	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
-	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
-	| am33_2.0 \
-	| arc | arceb \
-	| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
-	| avr | avr32 \
-	| be32 | be64 \
-	| bfin \
-	| c4x | c8051 | clipper \
-	| d10v | d30v | dlx | dsp16xx \
-	| e2k | epiphany \
-	| fido | fr30 | frv | ft32 \
-	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
-	| hexagon \
-	| i370 | i860 | i960 | ia64 \
-	| ip2k | iq2000 \
-	| k1om \
-	| le32 | le64 \
-	| lm32 \
-	| m32c | m32r | m32rle | m68000 | m68k | m88k \
-	| maxq | mb | microblaze | microblazeel | mcore | mep | metag \
-	| mips | mipsbe | mipseb | mipsel | mipsle \
-	| mips16 \
-	| mips64 | mips64el \
-	| mips64octeon | mips64octeonel \
-	| mips64orion | mips64orionel \
-	| mips64r5900 | mips64r5900el \
-	| mips64vr | mips64vrel \
-	| mips64vr4100 | mips64vr4100el \
-	| mips64vr4300 | mips64vr4300el \
-	| mips64vr5000 | mips64vr5000el \
-	| mips64vr5900 | mips64vr5900el \
-	| mipsisa32 | mipsisa32el \
-	| mipsisa32r2 | mipsisa32r2el \
-	| mipsisa32r6 | mipsisa32r6el \
-	| mipsisa64 | mipsisa64el \
-	| mipsisa64r2 | mipsisa64r2el \
-	| mipsisa64r6 | mipsisa64r6el \
-	| mipsisa64sb1 | mipsisa64sb1el \
-	| mipsisa64sr71k | mipsisa64sr71kel \
-	| mipsr5900 | mipsr5900el \
-	| mipstx39 | mipstx39el \
-	| mn10200 | mn10300 \
-	| moxie \
-	| mt \
-	| msp430 \
-	| nds32 | nds32le | nds32be \
-	| nios | nios2 | nios2eb | nios2el \
-	| ns16k | ns32k \
-	| open8 | or1k | or1knd | or32 \
-	| pdp10 | pdp11 | pj | pjl \
-	| powerpc | powerpc64 | powerpc64le | powerpcle \
-	| pyramid \
-	| riscv32 | riscv64 \
-	| rl78 | rx \
-	| score \
-	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
-	| sh64 | sh64le \
-	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
-	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
-	| spu \
-	| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
-	| ubicom32 \
-	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
-	| visium \
-	| we32k \
-	| x86 | xc16x | xstormy16 | xtensa \
-	| z8k | z80)
-		basic_machine=$basic_machine-unknown
-		;;
-	c54x)
-		basic_machine=tic54x-unknown
-		;;
-	c55x)
-		basic_machine=tic55x-unknown
-		;;
-	c6x)
-		basic_machine=tic6x-unknown
-		;;
-	leon|leon[3-9])
-		basic_machine=sparc-$basic_machine
+	# Here we handle the default manufacturer of certain CPU types.  It is in
+	# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		cpu=hppa1.1
+		vendor=winbond
 		;;
-	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
-		basic_machine=$basic_machine-unknown
-		os=-none
+	op50n)
+		cpu=hppa1.1
+		vendor=oki
 		;;
-	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+	op60c)
+		cpu=hppa1.1
+		vendor=oki
 		;;
-	ms1)
-		basic_machine=mt-unknown
+	ibm*)
+		cpu=i370
+		vendor=ibm
 		;;
-
-	strongarm | thumb | xscale)
-		basic_machine=arm-unknown
-		;;
-	xgate)
-		basic_machine=$basic_machine-unknown
-		os=-none
+	orion105)
+		cpu=clipper
+		vendor=highlevel
 		;;
-	xscaleeb)
-		basic_machine=armeb-unknown
+	mac | mpw | mac-mpw)
+		cpu=m68k
+		vendor=apple
 		;;
-
-	xscaleel)
-		basic_machine=armel-unknown
+	pmac | pmac-mpw)
+		cpu=powerpc
+		vendor=apple
 		;;
 
-	# We use `pc' rather than `unknown'
-	# because (1) that's what they normally are, and
-	# (2) the word "unknown" tends to confuse beginning users.
-	i*86 | x86_64)
-	  basic_machine=$basic_machine-pc
-	  ;;
-	# Object if more than one company name word.
-	*-*-*)
-		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-		exit 1
-		;;
-	# Recognize the basic CPU types with company name.
-	580-* \
-	| a29k-* \
-	| aarch64-* | aarch64_be-* \
-	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
-	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
-	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
-	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
-	| avr-* | avr32-* \
-	| be32-* | be64-* \
-	| bfin-* | bs2000-* \
-	| c[123]* | c30-* | [cjt]90-* | c4x-* \
-	| c8051-* | clipper-* | craynv-* | cydra-* \
-	| d10v-* | d30v-* | dlx-* \
-	| e2k-* | elxsi-* \
-	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
-	| h8300-* | h8500-* \
-	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
-	| hexagon-* \
-	| i*86-* | i860-* | i960-* | ia64-* \
-	| ip2k-* | iq2000-* \
-	| k1om-* \
-	| le32-* | le64-* \
-	| lm32-* \
-	| m32c-* | m32r-* | m32rle-* \
-	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
-	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \
-	| microblaze-* | microblazeel-* \
-	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
-	| mips16-* \
-	| mips64-* | mips64el-* \
-	| mips64octeon-* | mips64octeonel-* \
-	| mips64orion-* | mips64orionel-* \
-	| mips64r5900-* | mips64r5900el-* \
-	| mips64vr-* | mips64vrel-* \
-	| mips64vr4100-* | mips64vr4100el-* \
-	| mips64vr4300-* | mips64vr4300el-* \
-	| mips64vr5000-* | mips64vr5000el-* \
-	| mips64vr5900-* | mips64vr5900el-* \
-	| mipsisa32-* | mipsisa32el-* \
-	| mipsisa32r2-* | mipsisa32r2el-* \
-	| mipsisa32r6-* | mipsisa32r6el-* \
-	| mipsisa64-* | mipsisa64el-* \
-	| mipsisa64r2-* | mipsisa64r2el-* \
-	| mipsisa64r6-* | mipsisa64r6el-* \
-	| mipsisa64sb1-* | mipsisa64sb1el-* \
-	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
-	| mipsr5900-* | mipsr5900el-* \
-	| mipstx39-* | mipstx39el-* \
-	| mmix-* \
-	| mt-* \
-	| msp430-* \
-	| nds32-* | nds32le-* | nds32be-* \
-	| nios-* | nios2-* | nios2eb-* | nios2el-* \
-	| none-* | np1-* | ns16k-* | ns32k-* \
-	| open8-* \
-	| or1k*-* \
-	| orion-* \
-	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
-	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
-	| pyramid-* \
-	| rl78-* | romp-* | rs6000-* | rx-* \
-	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
-	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
-	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
-	| sparclite-* \
-	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
-	| tahoe-* \
-	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
-	| tile*-* \
-	| tron-* \
-	| ubicom32-* \
-	| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
-	| vax-* \
-	| visium-* \
-	| we32k-* \
-	| x86-* | x86_64-* | xc16x-* | xps100-* \
-	| xstormy16-* | xtensa*-* \
-	| ymp-* \
-	| z8k-* | z80-*)
-		;;
-	# Recognize the basic CPU types without company name, with glob match.
-	xtensa*)
-		basic_machine=$basic_machine-unknown
-		;;
 	# Recognize the various machine names and aliases which stand
 	# for a CPU type and a company and sometimes even an OS.
-	386bsd)
-		basic_machine=i386-unknown
-		os=-bsd
-		;;
 	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
-		basic_machine=m68000-att
+		cpu=m68000
+		vendor=att
 		;;
 	3b*)
-		basic_machine=we32k-att
-		;;
-	a29khif)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-	abacus)
-		basic_machine=abacus-unknown
-		;;
-	adobe68k)
-		basic_machine=m68010-adobe
-		os=-scout
-		;;
-	alliant | fx80)
-		basic_machine=fx80-alliant
-		;;
-	altos | altos3068)
-		basic_machine=m68k-altos
-		;;
-	am29k)
-		basic_machine=a29k-none
-		os=-bsd
-		;;
-	amd64)
-		basic_machine=x86_64-pc
-		;;
-	amd64-*)
-		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	amdahl)
-		basic_machine=580-amdahl
-		os=-sysv
-		;;
-	amiga | amiga-*)
-		basic_machine=m68k-unknown
-		;;
-	amigaos | amigados)
-		basic_machine=m68k-unknown
-		os=-amigaos
-		;;
-	amigaunix | amix)
-		basic_machine=m68k-unknown
-		os=-sysv4
-		;;
-	apollo68)
-		basic_machine=m68k-apollo
-		os=-sysv
-		;;
-	apollo68bsd)
-		basic_machine=m68k-apollo
-		os=-bsd
-		;;
-	aros)
-		basic_machine=i386-pc
-		os=-aros
-		;;
-        asmjs)
-		basic_machine=asmjs-unknown
-		;;
-	aux)
-		basic_machine=m68k-apple
-		os=-aux
-		;;
-	balance)
-		basic_machine=ns32k-sequent
-		os=-dynix
-		;;
-	blackfin)
-		basic_machine=bfin-unknown
-		os=-linux
-		;;
-	blackfin-*)
-		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
-		os=-linux
+		cpu=we32k
+		vendor=att
 		;;
 	bluegene*)
-		basic_machine=powerpc-ibm
-		os=-cnk
-		;;
-	c54x-*)
-		basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	c55x-*)
-		basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	c6x-*)
-		basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	c90)
-		basic_machine=c90-cray
-		os=-unicos
-		;;
-	cegcc)
-		basic_machine=arm-unknown
-		os=-cegcc
-		;;
-	convex-c1)
-		basic_machine=c1-convex
-		os=-bsd
-		;;
-	convex-c2)
-		basic_machine=c2-convex
-		os=-bsd
-		;;
-	convex-c32)
-		basic_machine=c32-convex
-		os=-bsd
-		;;
-	convex-c34)
-		basic_machine=c34-convex
-		os=-bsd
-		;;
-	convex-c38)
-		basic_machine=c38-convex
-		os=-bsd
-		;;
-	cray | j90)
-		basic_machine=j90-cray
-		os=-unicos
-		;;
-	craynv)
-		basic_machine=craynv-cray
-		os=-unicosmp
-		;;
-	cr16 | cr16-*)
-		basic_machine=cr16-unknown
-		os=-elf
-		;;
-	crds | unos)
-		basic_machine=m68k-crds
-		;;
-	crisv32 | crisv32-* | etraxfs*)
-		basic_machine=crisv32-axis
-		;;
-	cris | cris-* | etrax*)
-		basic_machine=cris-axis
-		;;
-	crx)
-		basic_machine=crx-unknown
-		os=-elf
-		;;
-	da30 | da30-*)
-		basic_machine=m68k-da30
-		;;
-	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
-		basic_machine=mips-dec
+		cpu=powerpc
+		vendor=ibm
+		basic_os=cnk
 		;;
 	decsystem10* | dec10*)
-		basic_machine=pdp10-dec
-		os=-tops10
+		cpu=pdp10
+		vendor=dec
+		basic_os=tops10
 		;;
 	decsystem20* | dec20*)
-		basic_machine=pdp10-dec
-		os=-tops20
+		cpu=pdp10
+		vendor=dec
+		basic_os=tops20
 		;;
 	delta | 3300 | motorola-3300 | motorola-delta \
 	      | 3300-motorola | delta-motorola)
-		basic_machine=m68k-motorola
+		cpu=m68k
+		vendor=motorola
 		;;
-	delta88)
-		basic_machine=m88k-motorola
-		os=-sysv3
-		;;
-	dicos)
-		basic_machine=i686-pc
-		os=-dicos
-		;;
-	djgpp)
-		basic_machine=i586-pc
-		os=-msdosdjgpp
-		;;
-	dpx20 | dpx20-*)
-		basic_machine=rs6000-bull
-		os=-bosx
-		;;
-	dpx2* | dpx2*-bull)
-		basic_machine=m68k-bull
-		os=-sysv3
-		;;
-	ebmon29k)
-		basic_machine=a29k-amd
-		os=-ebmon
-		;;
-	elxsi)
-		basic_machine=elxsi-elxsi
-		os=-bsd
+	dpx2*)
+		cpu=m68k
+		vendor=bull
+		basic_os=sysv3
 		;;
 	encore | umax | mmax)
-		basic_machine=ns32k-encore
+		cpu=ns32k
+		vendor=encore
 		;;
-	es1800 | OSE68k | ose68k | ose | OSE)
-		basic_machine=m68k-ericsson
-		os=-ose
+	elxsi)
+		cpu=elxsi
+		vendor=elxsi
+		basic_os=${basic_os:-bsd}
 		;;
 	fx2800)
-		basic_machine=i860-alliant
+		cpu=i860
+		vendor=alliant
 		;;
 	genix)
-		basic_machine=ns32k-ns
-		;;
-	gmicro)
-		basic_machine=tron-gmicro
-		os=-sysv
-		;;
-	go32)
-		basic_machine=i386-pc
-		os=-go32
+		cpu=ns32k
+		vendor=ns
 		;;
 	h3050r* | hiux*)
-		basic_machine=hppa1.1-hitachi
-		os=-hiuxwe2
-		;;
-	h8300hms)
-		basic_machine=h8300-hitachi
-		os=-hms
-		;;
-	h8300xray)
-		basic_machine=h8300-hitachi
-		os=-xray
-		;;
-	h8500hms)
-		basic_machine=h8500-hitachi
-		os=-hms
-		;;
-	harris)
-		basic_machine=m88k-harris
-		os=-sysv3
-		;;
-	hp300-*)
-		basic_machine=m68k-hp
-		;;
-	hp300bsd)
-		basic_machine=m68k-hp
-		os=-bsd
-		;;
-	hp300hpux)
-		basic_machine=m68k-hp
-		os=-hpux
+		cpu=hppa1.1
+		vendor=hitachi
+		basic_os=hiuxwe2
 		;;
 	hp3k9[0-9][0-9] | hp9[0-9][0-9])
-		basic_machine=hppa1.0-hp
+		cpu=hppa1.0
+		vendor=hp
 		;;
 	hp9k2[0-9][0-9] | hp9k31[0-9])
-		basic_machine=m68000-hp
+		cpu=m68000
+		vendor=hp
 		;;
 	hp9k3[2-9][0-9])
-		basic_machine=m68k-hp
+		cpu=m68k
+		vendor=hp
 		;;
 	hp9k6[0-9][0-9] | hp6[0-9][0-9])
-		basic_machine=hppa1.0-hp
+		cpu=hppa1.0
+		vendor=hp
 		;;
 	hp9k7[0-79][0-9] | hp7[0-79][0-9])
-		basic_machine=hppa1.1-hp
+		cpu=hppa1.1
+		vendor=hp
 		;;
 	hp9k78[0-9] | hp78[0-9])
 		# FIXME: really hppa2.0-hp
-		basic_machine=hppa1.1-hp
+		cpu=hppa1.1
+		vendor=hp
 		;;
 	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
 		# FIXME: really hppa2.0-hp
-		basic_machine=hppa1.1-hp
+		cpu=hppa1.1
+		vendor=hp
 		;;
 	hp9k8[0-9][13679] | hp8[0-9][13679])
-		basic_machine=hppa1.1-hp
+		cpu=hppa1.1
+		vendor=hp
 		;;
 	hp9k8[0-9][0-9] | hp8[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hppa-next)
-		os=-nextstep3
-		;;
-	hppaosf)
-		basic_machine=hppa1.1-hp
-		os=-osf
-		;;
-	hppro)
-		basic_machine=hppa1.1-hp
-		os=-proelf
-		;;
-	i370-ibm* | ibm*)
-		basic_machine=i370-ibm
+		cpu=hppa1.0
+		vendor=hp
 		;;
 	i*86v32)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv32
+		cpu=`echo "$1" | sed -e 's/86.*/86/'`
+		vendor=pc
+		basic_os=sysv32
 		;;
 	i*86v4*)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv4
+		cpu=`echo "$1" | sed -e 's/86.*/86/'`
+		vendor=pc
+		basic_os=sysv4
 		;;
 	i*86v)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv
+		cpu=`echo "$1" | sed -e 's/86.*/86/'`
+		vendor=pc
+		basic_os=sysv
 		;;
 	i*86sol2)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-solaris2
+		cpu=`echo "$1" | sed -e 's/86.*/86/'`
+		vendor=pc
+		basic_os=solaris2
 		;;
-	i386mach)
-		basic_machine=i386-mach
-		os=-mach
-		;;
-	i386-vsta | vsta)
-		basic_machine=i386-unknown
-		os=-vsta
+	j90 | j90-cray)
+		cpu=j90
+		vendor=cray
+		basic_os=${basic_os:-unicos}
 		;;
 	iris | iris4d)
-		basic_machine=mips-sgi
-		case $os in
-		    -irix*)
+		cpu=mips
+		vendor=sgi
+		case $basic_os in
+		    irix*)
 			;;
 		    *)
-			os=-irix4
+			basic_os=irix4
 			;;
 		esac
 		;;
-	isi68 | isi)
-		basic_machine=m68k-isi
-		os=-sysv
-		;;
-	leon-*|leon[3-9]-*)
-		basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'`
-		;;
-	m68knommu)
-		basic_machine=m68k-unknown
-		os=-linux
-		;;
-	m68knommu-*)
-		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
-		os=-linux
-		;;
-	m88k-omron*)
-		basic_machine=m88k-omron
-		;;
-	magnum | m3230)
-		basic_machine=mips-mips
-		os=-sysv
-		;;
-	merlin)
-		basic_machine=ns32k-utek
-		os=-sysv
-		;;
-	microblaze*)
-		basic_machine=microblaze-xilinx
-		;;
-	mingw64)
-		basic_machine=x86_64-pc
-		os=-mingw64
-		;;
-	mingw32)
-		basic_machine=i686-pc
-		os=-mingw32
-		;;
-	mingw32ce)
-		basic_machine=arm-unknown
-		os=-mingw32ce
-		;;
 	miniframe)
-		basic_machine=m68000-convergent
-		;;
-	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
-		basic_machine=m68k-atari
-		os=-mint
-		;;
-	mips3*-*)
-		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
-		;;
-	mips3*)
-		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
-		;;
-	monitor)
-		basic_machine=m68k-rom68k
-		os=-coff
-		;;
-	morphos)
-		basic_machine=powerpc-unknown
-		os=-morphos
-		;;
-	moxiebox)
-		basic_machine=moxie-unknown
-		os=-moxiebox
-		;;
-	msdos)
-		basic_machine=i386-pc
-		os=-msdos
-		;;
-	ms1-*)
-		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
-		;;
-	msys)
-		basic_machine=i686-pc
-		os=-msys
-		;;
-	mvs)
-		basic_machine=i370-ibm
-		os=-mvs
-		;;
-	nacl)
-		basic_machine=le32-unknown
-		os=-nacl
+		cpu=m68000
+		vendor=convergent
 		;;
-	ncr3000)
-		basic_machine=i486-ncr
-		os=-sysv4
-		;;
-	netbsd386)
-		basic_machine=i386-unknown
-		os=-netbsd
-		;;
-	netwinder)
-		basic_machine=armv4l-rebel
-		os=-linux
-		;;
-	news | news700 | news800 | news900)
-		basic_machine=m68k-sony
-		os=-newsos
-		;;
-	news1000)
-		basic_machine=m68030-sony
-		os=-newsos
+	*mint | mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		cpu=m68k
+		vendor=atari
+		basic_os=mint
 		;;
 	news-3600 | risc-news)
-		basic_machine=mips-sony
-		os=-newsos
-		;;
-	necv70)
-		basic_machine=v70-nec
-		os=-sysv
-		;;
-	next | m*-next )
-		basic_machine=m68k-next
-		case $os in
-		    -nextstep* )
+		cpu=mips
+		vendor=sony
+		basic_os=newsos
+		;;
+	next | m*-next)
+		cpu=m68k
+		vendor=next
+		case $basic_os in
+		    openstep*)
+		        ;;
+		    nextstep*)
 			;;
-		    -ns2*)
-		      os=-nextstep2
+		    ns2*)
+		      basic_os=nextstep2
 			;;
 		    *)
-		      os=-nextstep3
+		      basic_os=nextstep3
 			;;
 		esac
 		;;
-	nh3000)
-		basic_machine=m68k-harris
-		os=-cxux
-		;;
-	nh[45]000)
-		basic_machine=m88k-harris
-		os=-cxux
-		;;
-	nindy960)
-		basic_machine=i960-intel
-		os=-nindy
-		;;
-	mon960)
-		basic_machine=i960-intel
-		os=-mon960
-		;;
-	nonstopux)
-		basic_machine=mips-compaq
-		os=-nonstopux
-		;;
 	np1)
-		basic_machine=np1-gould
-		;;
-	neo-tandem)
-		basic_machine=neo-tandem
-		;;
-	nse-tandem)
-		basic_machine=nse-tandem
-		;;
-	nsr-tandem)
-		basic_machine=nsr-tandem
+		cpu=np1
+		vendor=gould
 		;;
 	op50n-* | op60c-*)
-		basic_machine=hppa1.1-oki
-		os=-proelf
-		;;
-	openrisc | openrisc-*)
-		basic_machine=or32-unknown
-		;;
-	os400)
-		basic_machine=powerpc-ibm
-		os=-os400
-		;;
-	OSE68000 | ose68000)
-		basic_machine=m68000-ericsson
-		os=-ose
-		;;
-	os68k)
-		basic_machine=m68k-none
-		os=-os68k
+		cpu=hppa1.1
+		vendor=oki
+		basic_os=proelf
 		;;
 	pa-hitachi)
-		basic_machine=hppa1.1-hitachi
-		os=-hiuxwe2
-		;;
-	paragon)
-		basic_machine=i860-intel
-		os=-osf
-		;;
-	parisc)
-		basic_machine=hppa-unknown
-		os=-linux
-		;;
-	parisc-*)
-		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
-		os=-linux
+		cpu=hppa1.1
+		vendor=hitachi
+		basic_os=hiuxwe2
 		;;
 	pbd)
-		basic_machine=sparc-tti
+		cpu=sparc
+		vendor=tti
 		;;
 	pbb)
-		basic_machine=m68k-tti
-		;;
-	pc532 | pc532-*)
-		basic_machine=ns32k-pc532
-		;;
-	pc98)
-		basic_machine=i386-pc
+		cpu=m68k
+		vendor=tti
 		;;
-	pc98-*)
-		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentium | p5 | k5 | k6 | nexgen | viac3)
-		basic_machine=i586-pc
-		;;
-	pentiumpro | p6 | 6x86 | athlon | athlon_*)
-		basic_machine=i686-pc
-		;;
-	pentiumii | pentium2 | pentiumiii | pentium3)
-		basic_machine=i686-pc
-		;;
-	pentium4)
-		basic_machine=i786-pc
-		;;
-	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
-		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentiumpro-* | p6-* | 6x86-* | athlon-*)
-		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
-		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentium4-*)
-		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+	pc532)
+		cpu=ns32k
+		vendor=pc532
 		;;
 	pn)
-		basic_machine=pn-gould
-		;;
-	power)	basic_machine=power-ibm
-		;;
-	ppc | ppcbe)	basic_machine=powerpc-unknown
+		cpu=pn
+		vendor=gould
 		;;
-	ppc-* | ppcbe-*)
-		basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppcle | powerpclittle | ppc-le | powerpc-little)
-		basic_machine=powerpcle-unknown
-		;;
-	ppcle-* | powerpclittle-*)
-		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppc64)	basic_machine=powerpc64-unknown
-		;;
-	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
-		basic_machine=powerpc64le-unknown
-		;;
-	ppc64le-* | powerpc64little-*)
-		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+	power)
+		cpu=power
+		vendor=ibm
 		;;
 	ps2)
-		basic_machine=i386-ibm
-		;;
-	pw32)
-		basic_machine=i586-unknown
-		os=-pw32
-		;;
-	rdos | rdos64)
-		basic_machine=x86_64-pc
-		os=-rdos
-		;;
-	rdos32)
-		basic_machine=i386-pc
-		os=-rdos
-		;;
-	rom68k)
-		basic_machine=m68k-rom68k
-		os=-coff
+		cpu=i386
+		vendor=ibm
 		;;
 	rm[46]00)
-		basic_machine=mips-siemens
+		cpu=mips
+		vendor=siemens
 		;;
 	rtpc | rtpc-*)
-		basic_machine=romp-ibm
-		;;
-	s390 | s390-*)
-		basic_machine=s390-ibm
+		cpu=romp
+		vendor=ibm
 		;;
-	s390x | s390x-*)
-		basic_machine=s390x-ibm
-		;;
-	sa29200)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-	sb1)
-		basic_machine=mipsisa64sb1-unknown
+	sde)
+		cpu=mipsisa32
+		vendor=sde
+		basic_os=${basic_os:-elf}
 		;;
-	sb1el)
-		basic_machine=mipsisa64sb1el-unknown
+	simso-wrs)
+		cpu=sparclite
+		vendor=wrs
+		basic_os=vxworks
 		;;
-	sde)
-		basic_machine=mipsisa32-sde
-		os=-elf
+	tower | tower-32)
+		cpu=m68k
+		vendor=ncr
 		;;
-	sei)
-		basic_machine=mips-sei
-		os=-seiux
+	vpp*|vx|vx-*)
+		cpu=f301
+		vendor=fujitsu
 		;;
-	sequent)
-		basic_machine=i386-sequent
+	w65)
+		cpu=w65
+		vendor=wdc
 		;;
-	sh)
-		basic_machine=sh-hitachi
-		os=-hms
+	w89k-*)
+		cpu=hppa1.1
+		vendor=winbond
+		basic_os=proelf
 		;;
-	sh5el)
-		basic_machine=sh5le-unknown
+	none)
+		cpu=none
+		vendor=none
 		;;
-	sh64)
-		basic_machine=sh64-unknown
+	leon|leon[3-9])
+		cpu=sparc
+		vendor=$basic_machine
 		;;
-	sparclite-wrs | simso-wrs)
-		basic_machine=sparclite-wrs
-		os=-vxworks
+	leon-*|leon[3-9]-*)
+		cpu=sparc
+		vendor=`echo "$basic_machine" | sed 's/-.*//'`
 		;;
-	sps7)
-		basic_machine=m68k-bull
-		os=-sysv2
+
+	*-*)
+		# shellcheck disable=SC2162
+		saved_IFS=$IFS
+		IFS="-" read cpu vendor <<EOF
+$basic_machine
+EOF
+		IFS=$saved_IFS
 		;;
-	spur)
-		basic_machine=spur-unknown
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+		cpu=$basic_machine
+		vendor=pc
 		;;
-	st2000)
-		basic_machine=m68k-tandem
+	# These rules are duplicated from below for sake of the special case above;
+	# i.e. things that normalized to x86 arches should also default to "pc"
+	pc98)
+		cpu=i386
+		vendor=pc
 		;;
-	stratus)
-		basic_machine=i860-stratus
-		os=-sysv4
+	x64 | amd64)
+		cpu=x86_64
+		vendor=pc
 		;;
-	strongarm-* | thumb-*)
-		basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
+	# Recognize the basic CPU types without company name.
+	*)
+		cpu=$basic_machine
+		vendor=unknown
 		;;
-	sun2)
-		basic_machine=m68000-sun
+esac
+
+unset -v basic_machine
+
+# Decode basic machines in the full and proper CPU-Company form.
+case $cpu-$vendor in
+	# Here we handle the default manufacturer of certain CPU types in canonical form. It is in
+	# some cases the only manufacturer, in others, it is the most popular.
+	craynv-unknown)
+		vendor=cray
+		basic_os=${basic_os:-unicosmp}
 		;;
-	sun2os3)
-		basic_machine=m68000-sun
-		os=-sunos3
+	c90-unknown | c90-cray)
+		vendor=cray
+		basic_os=${Basic_os:-unicos}
 		;;
-	sun2os4)
-		basic_machine=m68000-sun
-		os=-sunos4
+	fx80-unknown)
+		vendor=alliant
 		;;
-	sun3os3)
-		basic_machine=m68k-sun
-		os=-sunos3
+	romp-unknown)
+		vendor=ibm
 		;;
-	sun3os4)
-		basic_machine=m68k-sun
-		os=-sunos4
+	mmix-unknown)
+		vendor=knuth
 		;;
-	sun4os3)
-		basic_machine=sparc-sun
-		os=-sunos3
+	microblaze-unknown | microblazeel-unknown)
+		vendor=xilinx
 		;;
-	sun4os4)
-		basic_machine=sparc-sun
-		os=-sunos4
+	rs6000-unknown)
+		vendor=ibm
 		;;
-	sun4sol2)
-		basic_machine=sparc-sun
-		os=-solaris2
+	vax-unknown)
+		vendor=dec
 		;;
-	sun3 | sun3-*)
-		basic_machine=m68k-sun
+	pdp11-unknown)
+		vendor=dec
 		;;
-	sun4)
-		basic_machine=sparc-sun
+	we32k-unknown)
+		vendor=att
 		;;
-	sun386 | sun386i | roadrunner)
-		basic_machine=i386-sun
+	cydra-unknown)
+		vendor=cydrome
 		;;
-	sv1)
-		basic_machine=sv1-cray
-		os=-unicos
+	i370-ibm*)
+		vendor=ibm
 		;;
-	symmetry)
-		basic_machine=i386-sequent
-		os=-dynix
+	orion-unknown)
+		vendor=highlevel
 		;;
-	t3e)
-		basic_machine=alphaev5-cray
-		os=-unicos
+	xps-unknown | xps100-unknown)
+		cpu=xps100
+		vendor=honeywell
 		;;
-	t90)
-		basic_machine=t90-cray
-		os=-unicos
+
+	# Here we normalize CPU types with a missing or matching vendor
+	dpx20-unknown | dpx20-bull)
+		cpu=rs6000
+		vendor=bull
+		basic_os=${basic_os:-bosx}
 		;;
-	tile*)
-		basic_machine=$basic_machine-unknown
-		os=-linux-gnu
+
+	# Here we normalize CPU types irrespective of the vendor
+	amd64-*)
+		cpu=x86_64
 		;;
-	tx39)
-		basic_machine=mipstx39-unknown
+	blackfin-*)
+		cpu=bfin
+		basic_os=linux
 		;;
-	tx39el)
-		basic_machine=mipstx39el-unknown
+	c54x-*)
+		cpu=tic54x
 		;;
-	toad1)
-		basic_machine=pdp10-xkl
-		os=-tops20
+	c55x-*)
+		cpu=tic55x
 		;;
-	tower | tower-32)
-		basic_machine=m68k-ncr
+	c6x-*)
+		cpu=tic6x
 		;;
-	tpf)
-		basic_machine=s390x-ibm
-		os=-tpf
+	e500v[12]-*)
+		cpu=powerpc
+		basic_os=${basic_os}"spe"
 		;;
-	udi29k)
-		basic_machine=a29k-amd
-		os=-udi
+	mips3*-*)
+		cpu=mips64
 		;;
-	ultra3)
-		basic_machine=a29k-nyu
-		os=-sym1
+	ms1-*)
+		cpu=mt
 		;;
-	v810 | necv810)
-		basic_machine=v810-nec
-		os=-none
+	m68knommu-*)
+		cpu=m68k
+		basic_os=linux
 		;;
-	vaxv)
-		basic_machine=vax-dec
-		os=-sysv
+	m9s12z-* | m68hcs12z-* | hcs12z-* | s12z-*)
+		cpu=s12z
 		;;
-	vms)
-		basic_machine=vax-dec
-		os=-vms
+	openrisc-*)
+		cpu=or32
 		;;
-	vpp*|vx|vx-*)
-		basic_machine=f301-fujitsu
+	parisc-*)
+		cpu=hppa
+		basic_os=linux
 		;;
-	vxworks960)
-		basic_machine=i960-wrs
-		os=-vxworks
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		cpu=i586
 		;;
-	vxworks68)
-		basic_machine=m68k-wrs
-		os=-vxworks
+	pentiumpro-* | p6-* | 6x86-* | athlon-* | athalon_*-*)
+		cpu=i686
 		;;
-	vxworks29k)
-		basic_machine=a29k-wrs
-		os=-vxworks
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		cpu=i686
 		;;
-	w65*)
-		basic_machine=w65-wdc
-		os=-none
+	pentium4-*)
+		cpu=i786
 		;;
-	w89k-*)
-		basic_machine=hppa1.1-winbond
-		os=-proelf
+	pc98-*)
+		cpu=i386
 		;;
-	xbox)
-		basic_machine=i686-pc
-		os=-mingw32
+	ppc-* | ppcbe-*)
+		cpu=powerpc
 		;;
-	xps | xps100)
-		basic_machine=xps100-honeywell
+	ppcle-* | powerpclittle-*)
+		cpu=powerpcle
 		;;
-	xscale-* | xscalee[bl]-*)
-		basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
+	ppc64-*)
+		cpu=powerpc64
 		;;
-	ymp)
-		basic_machine=ymp-cray
-		os=-unicos
+	ppc64le-* | powerpc64little-*)
+		cpu=powerpc64le
 		;;
-	z8k-*-coff)
-		basic_machine=z8k-unknown
-		os=-sim
+	sb1-*)
+		cpu=mipsisa64sb1
 		;;
-	z80-*-coff)
-		basic_machine=z80-unknown
-		os=-sim
+	sb1el-*)
+		cpu=mipsisa64sb1el
 		;;
-	none)
-		basic_machine=none-none
-		os=-none
+	sh5e[lb]-*)
+		cpu=`echo "$cpu" | sed 's/^\(sh.\)e\(.\)$/\1\2e/'`
 		;;
-
-# Here we handle the default manufacturer of certain CPU types.  It is in
-# some cases the only manufacturer, in others, it is the most popular.
-	w89k)
-		basic_machine=hppa1.1-winbond
+	spur-*)
+		cpu=spur
 		;;
-	op50n)
-		basic_machine=hppa1.1-oki
+	strongarm-* | thumb-*)
+		cpu=arm
 		;;
-	op60c)
-		basic_machine=hppa1.1-oki
+	tx39-*)
+		cpu=mipstx39
 		;;
-	romp)
-		basic_machine=romp-ibm
+	tx39el-*)
+		cpu=mipstx39el
 		;;
-	mmix)
-		basic_machine=mmix-knuth
+	x64-*)
+		cpu=x86_64
 		;;
-	rs6000)
-		basic_machine=rs6000-ibm
+	xscale-* | xscalee[bl]-*)
+		cpu=`echo "$cpu" | sed 's/^xscale/arm/'`
 		;;
-	vax)
-		basic_machine=vax-dec
+	arm64-*)
+		cpu=aarch64
 		;;
-	pdp10)
-		# there are many clones, so DEC is not a safe bet
-		basic_machine=pdp10-unknown
+
+	# Recognize the canonical CPU Types that limit and/or modify the
+	# company names they are paired with.
+	cr16-*)
+		basic_os=${basic_os:-elf}
 		;;
-	pdp11)
-		basic_machine=pdp11-dec
+	crisv32-* | etraxfs*-*)
+		cpu=crisv32
+		vendor=axis
 		;;
-	we32k)
-		basic_machine=we32k-att
+	cris-* | etrax*-*)
+		cpu=cris
+		vendor=axis
 		;;
-	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
-		basic_machine=sh-unknown
+	crx-*)
+		basic_os=${basic_os:-elf}
 		;;
-	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
-		basic_machine=sparc-sun
+	neo-tandem)
+		cpu=neo
+		vendor=tandem
 		;;
-	cydra)
-		basic_machine=cydra-cydrome
+	nse-tandem)
+		cpu=nse
+		vendor=tandem
 		;;
-	orion)
-		basic_machine=orion-highlevel
+	nsr-tandem)
+		cpu=nsr
+		vendor=tandem
 		;;
-	orion105)
-		basic_machine=clipper-highlevel
+	nsv-tandem)
+		cpu=nsv
+		vendor=tandem
 		;;
-	mac | mpw | mac-mpw)
-		basic_machine=m68k-apple
+	nsx-tandem)
+		cpu=nsx
+		vendor=tandem
 		;;
-	pmac | pmac-mpw)
-		basic_machine=powerpc-apple
+	mipsallegrexel-sony)
+		cpu=mipsallegrexel
+		vendor=sony
 		;;
-	*-unknown)
-		# Make sure to match an already-canonicalized machine name.
+	tile*-*)
+		basic_os=${basic_os:-linux-gnu}
 		;;
+
 	*)
-		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-		exit 1
+		# Recognize the canonical CPU types that are allowed with any
+		# company name.
+		case $cpu in
+			1750a | 580 \
+			| a29k \
+			| aarch64 | aarch64_be \
+			| abacus \
+			| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] \
+			| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] \
+			| alphapca5[67] | alpha64pca5[67] \
+			| am33_2.0 \
+			| amdgcn \
+			| arc | arceb | arc32 | arc64 \
+			| arm | arm[lb]e | arme[lb] | armv* \
+			| avr | avr32 \
+			| asmjs \
+			| ba \
+			| be32 | be64 \
+			| bfin | bpf | bs2000 \
+			| c[123]* | c30 | [cjt]90 | c4x \
+			| c8051 | clipper | craynv | csky | cydra \
+			| d10v | d30v | dlx | dsp16xx \
+			| e2k | elxsi | epiphany \
+			| f30[01] | f700 | fido | fr30 | frv | ft32 | fx80 \
+			| h8300 | h8500 \
+			| hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+			| hexagon \
+			| i370 | i*86 | i860 | i960 | ia16 | ia64 \
+			| ip2k | iq2000 \
+			| k1om \
+			| le32 | le64 \
+			| lm32 \
+			| loongarch32 | loongarch64 | loongarchx32 \
+			| m32c | m32r | m32rle \
+			| m5200 | m68000 | m680[012346]0 | m68360 | m683?2 | m68k \
+			| m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x \
+			| m88110 | m88k | maxq | mb | mcore | mep | metag \
+			| microblaze | microblazeel \
+			| mips | mipsbe | mipseb | mipsel | mipsle \
+			| mips16 \
+			| mips64 | mips64eb | mips64el \
+			| mips64octeon | mips64octeonel \
+			| mips64orion | mips64orionel \
+			| mips64r5900 | mips64r5900el \
+			| mips64vr | mips64vrel \
+			| mips64vr4100 | mips64vr4100el \
+			| mips64vr4300 | mips64vr4300el \
+			| mips64vr5000 | mips64vr5000el \
+			| mips64vr5900 | mips64vr5900el \
+			| mipsisa32 | mipsisa32el \
+			| mipsisa32r2 | mipsisa32r2el \
+			| mipsisa32r3 | mipsisa32r3el \
+			| mipsisa32r5 | mipsisa32r5el \
+			| mipsisa32r6 | mipsisa32r6el \
+			| mipsisa64 | mipsisa64el \
+			| mipsisa64r2 | mipsisa64r2el \
+			| mipsisa64r3 | mipsisa64r3el \
+			| mipsisa64r5 | mipsisa64r5el \
+			| mipsisa64r6 | mipsisa64r6el \
+			| mipsisa64sb1 | mipsisa64sb1el \
+			| mipsisa64sr71k | mipsisa64sr71kel \
+			| mipsr5900 | mipsr5900el \
+			| mipstx39 | mipstx39el \
+			| mmix \
+			| mn10200 | mn10300 \
+			| moxie \
+			| mt \
+			| msp430 \
+			| nds32 | nds32le | nds32be \
+			| nfp \
+			| nios | nios2 | nios2eb | nios2el \
+			| none | np1 | ns16k | ns32k | nvptx \
+			| open8 \
+			| or1k* \
+			| or32 \
+			| orion \
+			| picochip \
+			| pdp10 | pdp11 | pj | pjl | pn | power \
+			| powerpc | powerpc64 | powerpc64le | powerpcle | powerpcspe \
+			| pru \
+			| pyramid \
+			| riscv | riscv32 | riscv32be | riscv64 | riscv64be \
+			| rl78 | romp | rs6000 | rx \
+			| s390 | s390x \
+			| score \
+			| sh | shl \
+			| sh[1234] | sh[24]a | sh[24]ae[lb] | sh[23]e | she[lb] | sh[lb]e \
+			| sh[1234]e[lb] |  sh[12345][lb]e | sh[23]ele | sh64 | sh64le \
+			| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet \
+			| sparclite \
+			| sparcv8 | sparcv9 | sparcv9b | sparcv9v | sv1 | sx* \
+			| spu \
+			| tahoe \
+			| thumbv7* \
+			| tic30 | tic4x | tic54x | tic55x | tic6x | tic80 \
+			| tron \
+			| ubicom32 \
+			| v70 | v850 | v850e | v850e1 | v850es | v850e2 | v850e2v3 \
+			| vax \
+			| visium \
+			| w65 \
+			| wasm32 | wasm64 \
+			| we32k \
+			| x86 | x86_64 | xc16x | xgate | xps100 \
+			| xstormy16 | xtensa* \
+			| ymp \
+			| z8k | z80)
+				;;
+
+			*)
+				echo Invalid configuration \`"$1"\': machine \`"$cpu-$vendor"\' not recognized 1>&2
+				exit 1
+				;;
+		esac
 		;;
 esac
 
 # Here we canonicalize certain aliases for manufacturers.
-case $basic_machine in
-	*-digital*)
-		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+case $vendor in
+	digital*)
+		vendor=dec
 		;;
-	*-commodore*)
-		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+	commodore*)
+		vendor=cbm
 		;;
 	*)
 		;;
@@ -1343,200 +1301,215 @@ esac
 
 # Decode manufacturer-specific aliases for certain operating systems.
 
-if [ x"$os" != x"" ]
+if test x$basic_os != x
 then
+
+# First recognize some ad-hoc caes, or perhaps split kernel-os, or else just
+# set os.
+case $basic_os in
+	gnu/linux*)
+		kernel=linux
+		os=`echo "$basic_os" | sed -e 's|gnu/linux|gnu|'`
+		;;
+	os2-emx)
+		kernel=os2
+		os=`echo "$basic_os" | sed -e 's|os2-emx|emx|'`
+		;;
+	nto-qnx*)
+		kernel=nto
+		os=`echo "$basic_os" | sed -e 's|nto-qnx|qnx|'`
+		;;
+	*-*)
+		# shellcheck disable=SC2162
+		saved_IFS=$IFS
+		IFS="-" read kernel os <<EOF
+$basic_os
+EOF
+		IFS=$saved_IFS
+		;;
+	# Default OS when just kernel was specified
+	nto*)
+		kernel=nto
+		os=`echo "$basic_os" | sed -e 's|nto|qnx|'`
+		;;
+	linux*)
+		kernel=linux
+		os=`echo "$basic_os" | sed -e 's|linux|gnu|'`
+		;;
+	*)
+		kernel=
+		os=$basic_os
+		;;
+esac
+
+# Now, normalize the OS (knowing we just have one component, it's not a kernel,
+# etc.)
 case $os in
-	# First match some system type aliases
-	# that might get confused with valid system types.
-	# -solaris* is a basic system type, with this one exception.
-	-auroraux)
-		os=-auroraux
+	# First match some system type aliases that might get confused
+	# with valid system types.
+	# solaris* is a basic system type, with this one exception.
+	auroraux)
+		os=auroraux
 		;;
-	-solaris1 | -solaris1.*)
-		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+	bluegene*)
+		os=cnk
 		;;
-	-solaris)
-		os=-solaris2
+	solaris1 | solaris1.*)
+		os=`echo "$os" | sed -e 's|solaris1|sunos4|'`
 		;;
-	-svr4*)
-		os=-sysv4
+	solaris)
+		os=solaris2
 		;;
-	-unixware*)
-		os=-sysv4.2uw
+	unixware*)
+		os=sysv4.2uw
 		;;
-	-gnu/linux*)
-		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+	# es1800 is here to avoid being matched by es* (a different OS)
+	es1800*)
+		os=ose
 		;;
-	# First accept the basic system types.
-	# The portable systems comes first.
-	# Each alternative MUST END IN A *, to match a version number.
-	# -sysv* is not here because it comes later, after sysvr4.
-	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
-	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
-	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
-	      | -sym* | -kopensolaris* | -plan9* \
-	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
-	      | -aos* | -aros* | -cloudabi* \
-	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
-	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
-	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
-	      | -bitrig* | -openbsd* | -solidbsd* \
-	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
-	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
-	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
-	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
-	      | -chorusos* | -chorusrdb* | -cegcc* \
-	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-	      | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
-	      | -linux-newlib* | -linux-musl* | -linux-uclibc* \
-	      | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
-	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
-	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
-	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
-	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
-	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
-	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
-	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*)
-	# Remember, each alternative MUST END IN *, to match a version number.
-		;;
-	-qnx*)
-		case $basic_machine in
-		    x86-* | i*86-*)
-			;;
-		    *)
-			os=-nto$os
-			;;
-		esac
+	# Some version numbers need modification
+	chorusos*)
+		os=chorusos
 		;;
-	-nto-qnx*)
+	isc)
+		os=isc2.2
 		;;
-	-nto*)
-		os=`echo $os | sed -e 's|nto|nto-qnx|'`
+	sco6)
+		os=sco5v6
 		;;
-	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
-	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
-	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+	sco5)
+		os=sco3.2v5
 		;;
-	-mac*)
-		os=`echo $os | sed -e 's|mac|macos|'`
+	sco4)
+		os=sco3.2v4
 		;;
-	-linux-dietlibc)
-		os=-linux-dietlibc
+	sco3.2.[4-9]*)
+		os=`echo "$os" | sed -e 's/sco3.2./sco3.2v/'`
 		;;
-	-linux*)
-		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+	sco*v* | scout)
+		# Don't match below
 		;;
-	-sunos5*)
-		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+	sco*)
+		os=sco3.2v2
 		;;
-	-sunos6*)
-		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+	psos*)
+		os=psos
 		;;
-	-opened*)
-		os=-openedition
+	qnx*)
+		os=qnx
 		;;
-	-os400*)
-		os=-os400
+	hiux*)
+		os=hiuxwe2
 		;;
-	-wince*)
-		os=-wince
+	lynx*178)
+		os=lynxos178
 		;;
-	-osfrose*)
-		os=-osfrose
+	lynx*5)
+		os=lynxos5
 		;;
-	-osf*)
-		os=-osf
+	lynxos*)
+		# don't get caught up in next wildcard
 		;;
-	-utek*)
-		os=-bsd
+	lynx*)
+		os=lynxos
 		;;
-	-dynix*)
-		os=-bsd
+	mac[0-9]*)
+		os=`echo "$os" | sed -e 's|mac|macos|'`
 		;;
-	-acis*)
-		os=-aos
+	opened*)
+		os=openedition
 		;;
-	-atheos*)
-		os=-atheos
+	os400*)
+		os=os400
 		;;
-	-syllable*)
-		os=-syllable
+	sunos5*)
+		os=`echo "$os" | sed -e 's|sunos5|solaris2|'`
 		;;
-	-386bsd)
-		os=-bsd
+	sunos6*)
+		os=`echo "$os" | sed -e 's|sunos6|solaris3|'`
 		;;
-	-ctix* | -uts*)
-		os=-sysv
+	wince*)
+		os=wince
 		;;
-	-nova*)
-		os=-rtmk-nova
+	utek*)
+		os=bsd
 		;;
-	-ns2 )
-		os=-nextstep2
+	dynix*)
+		os=bsd
 		;;
-	-nsk*)
-		os=-nsk
+	acis*)
+		os=aos
 		;;
-	# Preserve the version number of sinix5.
-	-sinix5.*)
-		os=`echo $os | sed -e 's|sinix|sysv|'`
+	atheos*)
+		os=atheos
 		;;
-	-sinix*)
-		os=-sysv4
+	syllable*)
+		os=syllable
 		;;
-	-tpf*)
-		os=-tpf
+	386bsd)
+		os=bsd
 		;;
-	-triton*)
-		os=-sysv3
+	ctix* | uts*)
+		os=sysv
 		;;
-	-oss*)
-		os=-sysv3
+	nova*)
+		os=rtmk-nova
 		;;
-	-svr4)
-		os=-sysv4
+	ns2)
+		os=nextstep2
 		;;
-	-svr3)
-		os=-sysv3
+	# Preserve the version number of sinix5.
+	sinix5.*)
+		os=`echo "$os" | sed -e 's|sinix|sysv|'`
 		;;
-	-sysvr4)
-		os=-sysv4
+	sinix*)
+		os=sysv4
 		;;
-	# This must come after -sysvr4.
-	-sysv*)
+	tpf*)
+		os=tpf
 		;;
-	-ose*)
-		os=-ose
+	triton*)
+		os=sysv3
 		;;
-	-es1800*)
-		os=-ose
+	oss*)
+		os=sysv3
 		;;
-	-xenix)
-		os=-xenix
+	svr4*)
+		os=sysv4
 		;;
-	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
-		os=-mint
+	svr3)
+		os=sysv3
 		;;
-	-aros*)
-		os=-aros
+	sysvr4)
+		os=sysv4
 		;;
-	-zvmoe)
-		os=-zvmoe
+	ose*)
+		os=ose
 		;;
-	-dicos*)
-		os=-dicos
+	*mint | mint[0-9]* | *MiNT | MiNT[0-9]*)
+		os=mint
 		;;
-	-nacl*)
+	dicos*)
+		os=dicos
 		;;
-	-none)
+	pikeos*)
+		# Until real need of OS specific support for
+		# particular features comes up, bare metal
+		# configurations are quite functional.
+		case $cpu in
+		    arm*)
+			os=eabi
+			;;
+		    *)
+			os=elf
+			;;
+		esac
 		;;
 	*)
-		# Get rid of the `-' at the beginning of $os.
-		os=`echo $os | sed 's/[^-]*-//'`
-		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
-		exit 1
+		# No normalization, but not necessarily accepted, that comes below.
 		;;
 esac
+
 else
 
 # Here we handle the default operating systems that come with various machines.
@@ -1549,261 +1522,362 @@ else
 # will signal an error saying that MANUFACTURER isn't an operating
 # system, and we'll never get to this point.
 
-case $basic_machine in
+kernel=
+case $cpu-$vendor in
 	score-*)
-		os=-elf
+		os=elf
 		;;
 	spu-*)
-		os=-elf
+		os=elf
 		;;
 	*-acorn)
-		os=-riscix1.2
+		os=riscix1.2
 		;;
 	arm*-rebel)
-		os=-linux
+		kernel=linux
+		os=gnu
 		;;
 	arm*-semi)
-		os=-aout
+		os=aout
 		;;
 	c4x-* | tic4x-*)
-		os=-coff
+		os=coff
 		;;
 	c8051-*)
-		os=-elf
+		os=elf
+		;;
+	clipper-intergraph)
+		os=clix
 		;;
 	hexagon-*)
-		os=-elf
+		os=elf
 		;;
 	tic54x-*)
-		os=-coff
+		os=coff
 		;;
 	tic55x-*)
-		os=-coff
+		os=coff
 		;;
 	tic6x-*)
-		os=-coff
+		os=coff
 		;;
 	# This must come before the *-dec entry.
 	pdp10-*)
-		os=-tops20
+		os=tops20
 		;;
 	pdp11-*)
-		os=-none
+		os=none
 		;;
 	*-dec | vax-*)
-		os=-ultrix4.2
+		os=ultrix4.2
 		;;
 	m68*-apollo)
-		os=-domain
+		os=domain
 		;;
 	i386-sun)
-		os=-sunos4.0.2
+		os=sunos4.0.2
 		;;
 	m68000-sun)
-		os=-sunos3
+		os=sunos3
 		;;
 	m68*-cisco)
-		os=-aout
+		os=aout
 		;;
 	mep-*)
-		os=-elf
+		os=elf
 		;;
 	mips*-cisco)
-		os=-elf
+		os=elf
 		;;
 	mips*-*)
-		os=-elf
+		os=elf
 		;;
 	or32-*)
-		os=-coff
+		os=coff
 		;;
 	*-tti)	# must be before sparc entry or we get the wrong os.
-		os=-sysv3
+		os=sysv3
 		;;
 	sparc-* | *-sun)
-		os=-sunos4.1.1
+		os=sunos4.1.1
 		;;
-	*-be)
-		os=-beos
+	pru-*)
+		os=elf
 		;;
-	*-haiku)
-		os=-haiku
+	*-be)
+		os=beos
 		;;
 	*-ibm)
-		os=-aix
+		os=aix
 		;;
 	*-knuth)
-		os=-mmixware
+		os=mmixware
 		;;
 	*-wec)
-		os=-proelf
+		os=proelf
 		;;
 	*-winbond)
-		os=-proelf
+		os=proelf
 		;;
 	*-oki)
-		os=-proelf
+		os=proelf
 		;;
 	*-hp)
-		os=-hpux
+		os=hpux
 		;;
 	*-hitachi)
-		os=-hiux
+		os=hiux
 		;;
 	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
-		os=-sysv
+		os=sysv
 		;;
 	*-cbm)
-		os=-amigaos
+		os=amigaos
 		;;
 	*-dg)
-		os=-dgux
+		os=dgux
 		;;
 	*-dolphin)
-		os=-sysv3
+		os=sysv3
 		;;
 	m68k-ccur)
-		os=-rtu
+		os=rtu
 		;;
 	m88k-omron*)
-		os=-luna
+		os=luna
 		;;
-	*-next )
-		os=-nextstep
+	*-next)
+		os=nextstep
 		;;
 	*-sequent)
-		os=-ptx
+		os=ptx
 		;;
 	*-crds)
-		os=-unos
+		os=unos
 		;;
 	*-ns)
-		os=-genix
+		os=genix
 		;;
 	i370-*)
-		os=-mvs
-		;;
-	*-next)
-		os=-nextstep3
+		os=mvs
 		;;
 	*-gould)
-		os=-sysv
+		os=sysv
 		;;
 	*-highlevel)
-		os=-bsd
+		os=bsd
 		;;
 	*-encore)
-		os=-bsd
+		os=bsd
 		;;
 	*-sgi)
-		os=-irix
+		os=irix
 		;;
 	*-siemens)
-		os=-sysv4
+		os=sysv4
 		;;
 	*-masscomp)
-		os=-rtu
+		os=rtu
 		;;
 	f30[01]-fujitsu | f700-fujitsu)
-		os=-uxpv
+		os=uxpv
 		;;
 	*-rom68k)
-		os=-coff
+		os=coff
 		;;
 	*-*bug)
-		os=-coff
+		os=coff
 		;;
 	*-apple)
-		os=-macos
+		os=macos
 		;;
 	*-atari*)
-		os=-mint
+		os=mint
+		;;
+	*-wrs)
+		os=vxworks
 		;;
 	*)
-		os=-none
+		os=none
 		;;
 esac
+
 fi
 
+# Now, validate our (potentially fixed-up) OS.
+case $os in
+	# Sometimes we do "kernel-libc", so those need to count as OSes.
+	musl* | newlib* | relibc* | uclibc*)
+		;;
+	# Likewise for "kernel-abi"
+	eabi* | gnueabi*)
+		;;
+	# VxWorks passes extra cpu info in the 4th filed.
+	simlinux | simwindows | spe)
+		;;
+	# Now accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST end in a * to match a version number.
+	gnu* | android* | bsd* | mach* | minix* | genix* | ultrix* | irix* \
+	     | *vms* | esix* | aix* | cnk* | sunos | sunos[34]* \
+	     | hpux* | unos* | osf* | luna* | dgux* | auroraux* | solaris* \
+	     | sym* |  plan9* | psp* | sim* | xray* | os68k* | v88r* \
+	     | hiux* | abug | nacl* | netware* | windows* \
+	     | os9* | macos* | osx* | ios* \
+	     | mpw* | magic* | mmixware* | mon960* | lnews* \
+	     | amigaos* | amigados* | msdos* | newsos* | unicos* | aof* \
+	     | aos* | aros* | cloudabi* | sortix* | twizzler* \
+	     | nindy* | vxsim* | vxworks* | ebmon* | hms* | mvs* \
+	     | clix* | riscos* | uniplus* | iris* | isc* | rtu* | xenix* \
+	     | mirbsd* | netbsd* | dicos* | openedition* | ose* \
+	     | bitrig* | openbsd* | secbsd* | solidbsd* | libertybsd* | os108* \
+	     | ekkobsd* | freebsd* | riscix* | lynxos* | os400* \
+	     | bosx* | nextstep* | cxux* | aout* | elf* | oabi* \
+	     | ptx* | coff* | ecoff* | winnt* | domain* | vsta* \
+	     | udi* | lites* | ieee* | go32* | aux* | hcos* \
+	     | chorusrdb* | cegcc* | glidix* | serenity* \
+	     | cygwin* | msys* | pe* | moss* | proelf* | rtems* \
+	     | midipix* | mingw32* | mingw64* | mint* \
+	     | uxpv* | beos* | mpeix* | udk* | moxiebox* \
+	     | interix* | uwin* | mks* | rhapsody* | darwin* \
+	     | openstep* | oskit* | conix* | pw32* | nonstopux* \
+	     | storm-chaos* | tops10* | tenex* | tops20* | its* \
+	     | os2* | vos* | palmos* | uclinux* | nucleus* | morphos* \
+	     | scout* | superux* | sysv* | rtmk* | tpf* | windiss* \
+	     | powermax* | dnix* | nx6 | nx7 | sei* | dragonfly* \
+	     | skyos* | haiku* | rdos* | toppers* | drops* | es* \
+	     | onefs* | tirtos* | phoenix* | fuchsia* | redox* | bme* \
+	     | midnightbsd* | amdhsa* | unleashed* | emscripten* | wasi* \
+	     | nsk* | powerunix* | genode* | zvmoe* | qnx* | emx* | zephyr*)
+		;;
+	# This one is extra strict with allowed versions
+	sco3.2v2 | sco3.2v[4-9]* | sco5v6*)
+		# Don't forget version if it is 3.2v4 or newer.
+		;;
+	none)
+		;;
+	*)
+		echo Invalid configuration \`"$1"\': OS \`"$os"\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# As a final step for OS-related things, validate the OS-kernel combination
+# (given a valid OS), if there is a kernel.
+case $kernel-$os in
+	linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* \
+		   | linux-musl* | linux-relibc* | linux-uclibc* )
+		;;
+	uclinux-uclibc* )
+		;;
+	-dietlibc* | -newlib* | -musl* | -relibc* | -uclibc* )
+		# These are just libc implementations, not actual OSes, and thus
+		# require a kernel.
+		echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2
+		exit 1
+		;;
+	kfreebsd*-gnu* | kopensolaris*-gnu*)
+		;;
+	vxworks-simlinux | vxworks-simwindows | vxworks-spe)
+		;;
+	nto-qnx*)
+		;;
+	os2-emx)
+		;;
+	*-eabi* | *-gnueabi*)
+		;;
+	-*)
+		# Blank kernel with real OS is always fine.
+		;;
+	*-*)
+		echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2
+		exit 1
+		;;
+esac
+
 # Here we handle the case where we know the os, and the CPU type, but not the
 # manufacturer.  We pick the logical manufacturer.
-vendor=unknown
-case $basic_machine in
-	*-unknown)
-		case $os in
-			-riscix*)
+case $vendor in
+	unknown)
+		case $cpu-$os in
+			*-riscix*)
 				vendor=acorn
 				;;
-			-sunos*)
+			*-sunos*)
 				vendor=sun
 				;;
-			-cnk*|-aix*)
+			*-cnk* | *-aix*)
 				vendor=ibm
 				;;
-			-beos*)
+			*-beos*)
 				vendor=be
 				;;
-			-hpux*)
+			*-hpux*)
 				vendor=hp
 				;;
-			-mpeix*)
+			*-mpeix*)
 				vendor=hp
 				;;
-			-hiux*)
+			*-hiux*)
 				vendor=hitachi
 				;;
-			-unos*)
+			*-unos*)
 				vendor=crds
 				;;
-			-dgux*)
+			*-dgux*)
 				vendor=dg
 				;;
-			-luna*)
+			*-luna*)
 				vendor=omron
 				;;
-			-genix*)
+			*-genix*)
 				vendor=ns
 				;;
-			-mvs* | -opened*)
+			*-clix*)
+				vendor=intergraph
+				;;
+			*-mvs* | *-opened*)
+				vendor=ibm
+				;;
+			*-os400*)
 				vendor=ibm
 				;;
-			-os400*)
+			s390-* | s390x-*)
 				vendor=ibm
 				;;
-			-ptx*)
+			*-ptx*)
 				vendor=sequent
 				;;
-			-tpf*)
+			*-tpf*)
 				vendor=ibm
 				;;
-			-vxsim* | -vxworks* | -windiss*)
+			*-vxsim* | *-vxworks* | *-windiss*)
 				vendor=wrs
 				;;
-			-aux*)
+			*-aux*)
 				vendor=apple
 				;;
-			-hms*)
+			*-hms*)
 				vendor=hitachi
 				;;
-			-mpw* | -macos*)
+			*-mpw* | *-macos*)
 				vendor=apple
 				;;
-			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+			*-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*)
 				vendor=atari
 				;;
-			-vos*)
+			*-vos*)
 				vendor=stratus
 				;;
 		esac
-		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
 		;;
 esac
 
-echo $basic_machine$os
+echo "$cpu-$vendor-${kernel:+$kernel-}$os"
 exit
 
 # Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
+# eval: (add-hook 'before-save-hook 'time-stamp)
 # time-stamp-start: "timestamp='"
 # time-stamp-format: "%:y-%02m-%02d"
 # time-stamp-end: "'"
diff --git a/autoconf/m4/unreal.m4 b/autoconf/m4/unreal.m4
@@ -130,9 +130,13 @@ AC_DEFUN([CHECK_LIBCURL],
 		LIBS="$LIBS_SAVEDA"
 		CFLAGS="$CFLAGS_SAVEDA"
 
-		URL="url.o"
-		AC_SUBST(URL)
+		dnl Finally, choose the cURL implementation of url.c
+		URL="url_curl.o"
+	],[
+		dnl Choose UnrealIRCds internal implementation of url.c
+		URL="url_unreal.o"
 	]) dnl AS_IF(enable_curl) 
+	AC_SUBST(URL)
 ])
 
 dnl the following 2 macros are based on CHECK_SSL by Mark Ethan Trostler <trostler@juniper.net> 
@@ -178,7 +182,11 @@ AS_IF([test $enable_ssl != "no"],
 	else
 		CRYPTOLIB="-lssl -lcrypto";
 		if test ! "$ssldir" = "/usr" ; then
-			LDFLAGS="$LDFLAGS -L$ssldir/lib";
+			if test -d "$ssldir/lib64" ; then
+				LDFLAGS="$LDFLAGS -L$ssldir/lib64";
+			else
+				LDFLAGS="$LDFLAGS -L$ssldir/lib";
+			fi
 			dnl check if binary path exists
 			if test -f "$ssldir/bin/openssl"; then
 			    OPENSSLPATH="$ssldir/bin/openssl";
@@ -312,3 +320,94 @@ else
 	AC_MSG_RESULT([no])
 fi
 ])
+
+dnl For geoip-api-c
+AC_DEFUN([CHECK_GEOIP_CLASSIC],
+[
+	AC_ARG_ENABLE(geoip_classic,
+	[AC_HELP_STRING([--enable-geoip-classic=no/yes],[enable GeoIP Classic support])],
+	[enable_geoip_classic=$enableval],
+	[enable_geoip_classic=no])
+
+	AS_IF([test "x$enable_geoip_classic" = "xyes"],
+	[
+		dnl First see if the system provides it
+		has_system_geoip_classic="no"
+		PKG_CHECK_MODULES([GEOIP_CLASSIC], [geoip >= 1.6.0],
+		                  [has_system_geoip_classic=yes
+		                   AS_IF([test "x$PRIVATELIBDIR" != "x"], [rm -f "$PRIVATELIBDIR/"libGeoIP.*])],
+		                  [has_system_geoip_classic=no])
+
+		dnl Otherwise fallback to our own..
+		AS_IF([test "$has_system_geoip_classic" = "no"],[
+			dnl REMEMBER TO CHANGE WITH A NEW GEOIP LIBRARY RELEASE!
+			geoip_classic_version="1.6.12"
+			AC_MSG_RESULT(extracting GeoIP Classic library)
+			cur_dir=`pwd`
+			cd extras
+			dnl remove old directory to force a recompile...
+			dnl and remove its installation prefix just to clean things up.
+			rm -rf GeoIP-$geoip_classic_version geoip-classic
+			if test "x$ac_cv_path_GUNZIP" = "x" ; then
+				tar xfz geoip-classic.tar.gz
+			else
+				cp geoip-classic.tar.gz geoip-classic.tar.gz.bak
+				gunzip -f geoip-classic.tar.gz
+				cp geoip-classic.tar.gz.bak geoip-classic.tar.gz
+				tar xf geoip-classic.tar
+			fi
+			AC_MSG_RESULT(configuring GeoIP Classic library)
+			cd GeoIP-$geoip_classic_version
+			save_cflags="$CFLAGS"
+			CFLAGS="$orig_cflags"
+			export CFLAGS
+			./configure --prefix=$cur_dir/extras/geoip-classic --libdir=$PRIVATELIBDIR --enable-shared --disable-static || exit 1
+			CFLAGS="$save_cflags"
+			AC_MSG_RESULT(compiling GeoIP Classic library)
+			$ac_cv_prog_MAKER || exit 1
+			AC_MSG_RESULT(installing GeoIP Classic library)
+			$ac_cv_prog_MAKER install || exit 1
+			dnl Try pkg-config first...
+			AS_IF([test -n "$ac_cv_path_PKGCONFIG"],
+			       [GEOIP_CLASSIC_LIBS="`$ac_cv_path_PKGCONFIG --libs geoip.pc`"
+			        GEOIP_CLASSIC_CFLAGS="`$ac_cv_path_PKGCONFIG --cflags geoip.pc`"])
+			dnl In case the system does not have pkg-config, fallback to hardcoded settings...
+			AS_IF([test -z "$GEOIP_CLASSIC_LIBS"],
+			       [GEOIP_CLASSIC_LIBS="-L$PRIVATELIBDIR -lGeoIP"
+			        GEOIP_CLASSIC_CFLAGS="-I$cur_dir/extras/geoip-classic/include"])
+			cd $cur_dir
+		])
+		
+		AC_SUBST(GEOIP_CLASSIC_LIBS)
+		AC_SUBST(GEOIP_CLASSIC_CFLAGS)
+
+		GEOIP_CLASSIC_OBJECTS="geoip_classic.so"
+		AC_SUBST(GEOIP_CLASSIC_OBJECTS)
+	]) dnl AS_IF(enable_geoip_classic) 
+])
+
+AC_DEFUN([CHECK_LIBMAXMINDDB],
+[
+	AC_ARG_ENABLE(libmaxminddb,
+	[AC_HELP_STRING([--enable-libmaxminddb=no/yes],[enable GeoIP libmaxminddb support])],
+	[enable_libmaxminddb=$enableval],
+	[enable_libmaxminddb=no])
+
+	AS_IF([test "x$enable_libmaxminddb" = "xyes"],
+	[
+		dnl see if the system provides it
+		has_system_libmaxminddb="no"
+		PKG_CHECK_MODULES([LIBMAXMINDDB], [libmaxminddb >= 1.4.3],
+		                  [has_system_libmaxminddb=yes])
+		AS_IF([test "x$has_system_libmaxminddb" = "xyes"],
+		[
+
+			AC_SUBST(LIBMAXMINDDB_LIBS)
+			AC_SUBST(LIBMAXMINDDB_CFLAGS)
+
+			GEOIP_MAXMIND_OBJECTS="geoip_maxmind.so"
+			AC_SUBST(GEOIP_MAXMIND_OBJECTS)
+		])
+	])
+])
+
diff --git a/configure b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for unrealircd 5.2.0.1.
+# Generated by GNU Autoconf 2.69 for unrealircd 6.0.1.1.
 #
 # Report bugs to <https://bugs.unrealircd.org/>.
 #
@@ -580,8 +580,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='unrealircd'
 PACKAGE_TARNAME='unrealircd'
-PACKAGE_VERSION='5.2.0.1'
-PACKAGE_STRING='unrealircd 5.2.0.1'
+PACKAGE_VERSION='6.0.1.1'
+PACKAGE_STRING='unrealircd 6.0.1.1'
 PACKAGE_BUGREPORT='https://bugs.unrealircd.org/'
 PACKAGE_URL='https://unrealircd.org/'
 
@@ -626,6 +626,12 @@ ac_subst_vars='LTLIBOBJS
 LIBOBJS
 UNRLINCDIR
 IRCDLIBS
+GEOIP_MAXMIND_OBJECTS
+LIBMAXMINDDB_LIBS
+LIBMAXMINDDB_CFLAGS
+GEOIP_CLASSIC_OBJECTS
+GEOIP_CLASSIC_LIBS
+GEOIP_CLASSIC_CFLAGS
 URL
 PTHREAD_CFLAGS
 PTHREAD_LIBS
@@ -639,6 +645,8 @@ build_os
 build_vendor
 build_cpu
 build
+JANSSON_LIBS
+JANSSON_CFLAGS
 CARES_LIBS
 CARES_CFLAGS
 SODIUM_LIBS
@@ -746,19 +754,20 @@ with_docdir
 with_pidfile
 with_privatelibdir
 with_maxconnections
-enable_prefixaq
-with_showlistmodes
 with_no_operoverride
 with_operoverride_verify
 with_system_pcre2
 with_system_argon2
 with_system_sodium
 with_system_cares
+with_system_jansson
 enable_ssl
 enable_dynamic_linking
 enable_werror
 enable_asan
 enable_libcurl
+enable_geoip_classic
+enable_libmaxminddb
 '
       ac_precious_vars='build_alias
 host_alias
@@ -779,7 +788,13 @@ ARGON2_LIBS
 SODIUM_CFLAGS
 SODIUM_LIBS
 CARES_CFLAGS
-CARES_LIBS'
+CARES_LIBS
+JANSSON_CFLAGS
+JANSSON_LIBS
+GEOIP_CLASSIC_CFLAGS
+GEOIP_CLASSIC_LIBS
+LIBMAXMINDDB_CFLAGS
+LIBMAXMINDDB_LIBS'
 
 
 # Initialize some variables set by options.
@@ -1330,7 +1345,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures unrealircd 5.2.0.1 to adapt to many kinds of systems.
+\`configure' configures unrealircd 6.0.1.1 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1396,7 +1411,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of unrealircd 5.2.0.1:";;
+     short | recursive ) echo "Configuration of unrealircd 6.0.1.1:";;
    esac
   cat <<\_ACEOF
 
@@ -1406,7 +1421,6 @@ Optional Features:
   --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
   --enable-hardening      Enable compiler and linker options to frustrate
                           memory corruption exploits [yes]
-  --disable-prefixaq      Disable chanadmin (+a) and chanowner (+q) prefixes
   --enable-ssl=           enable ssl will check /usr/local/opt/openssl
                           /usr/local/ssl /usr/lib/ssl /usr/ssl /usr/pkg
                           /usr/sfw /usr/local /usr
@@ -1418,6 +1432,10 @@ Optional Features:
   --enable-asan           Enable address sanitizer and other debugging
                           options, not recommended for production servers!
   --enable-libcurl=DIR    enable libcurl (remote include) support
+  --enable-geoip-classic=no/yes
+                          enable GeoIP Classic support
+  --enable-libmaxminddb=no/yes
+                          enable GeoIP libmaxminddb support
 
 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
@@ -1447,7 +1465,6 @@ Optional Packages:
                           stored. Disable when building a package for a distro
   --with-maxconnections=size
                           Specify the max file descriptors to use
-  --with-showlistmodes    Specify whether modes are shown in /list
   --with-no-operoverride  Disable OperOverride
   --with-operoverride-verify
                           Require opers to invite themselves to +s/+p channels
@@ -1459,6 +1476,9 @@ Optional Packages:
                           library. Normally autodetected via pkg-config
   --without-system-cares  Use bundled version instead of system c-ares.
                           Normally autodetected via pkg-config.
+  --without-system-jansson
+                          Use bundled version instead of system jansson.
+                          Normally autodetected via pkg-config.
 
 Some influential environment variables:
   CC          C compiler command
@@ -1486,6 +1506,18 @@ Some influential environment variables:
   CARES_CFLAGS
               C compiler flags for CARES, overriding pkg-config
   CARES_LIBS  linker flags for CARES, overriding pkg-config
+  JANSSON_CFLAGS
+              C compiler flags for JANSSON, overriding pkg-config
+  JANSSON_LIBS
+              linker flags for JANSSON, overriding pkg-config
+  GEOIP_CLASSIC_CFLAGS
+              C compiler flags for GEOIP_CLASSIC, overriding pkg-config
+  GEOIP_CLASSIC_LIBS
+              linker flags for GEOIP_CLASSIC, overriding pkg-config
+  LIBMAXMINDDB_CFLAGS
+              C compiler flags for LIBMAXMINDDB, overriding pkg-config
+  LIBMAXMINDDB_LIBS
+              linker flags for LIBMAXMINDDB, overriding pkg-config
 
 Use these variables to override the choices made by `configure' or to help
 it to find libraries and programs with nonstandard names/locations.
@@ -1554,7 +1586,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-unrealircd configure 5.2.0.1
+unrealircd configure 6.0.1.1
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -1923,7 +1955,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by unrealircd $as_me 5.2.0.1, which was
+It was created by unrealircd $as_me 6.0.1.1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -2315,7 +2347,7 @@ orig_cflags="$CFLAGS"
 BUILDDIR_NOW="`pwd`"
 
 # Generation version number (e.g.: X in X.Y.Z)
-UNREAL_VERSION_GENERATION="5"
+UNREAL_VERSION_GENERATION="6"
 
 cat >>confdefs.h <<_ACEOF
 #define UNREAL_VERSION_GENERATION $UNREAL_VERSION_GENERATION
@@ -2323,7 +2355,7 @@ _ACEOF
 
 
 # Major version number (e.g.: Y in X.Y.Z)
-UNREAL_VERSION_MAJOR="2"
+UNREAL_VERSION_MAJOR="0"
 
 cat >>confdefs.h <<_ACEOF
 #define UNREAL_VERSION_MAJOR $UNREAL_VERSION_MAJOR
@@ -2331,7 +2363,7 @@ _ACEOF
 
 
 # Minor version number (e.g.: Z in X.Y.Z)
-UNREAL_VERSION_MINOR="0"
+UNREAL_VERSION_MINOR="1"
 
 cat >>confdefs.h <<_ACEOF
 #define UNREAL_VERSION_MINOR $UNREAL_VERSION_MINOR
@@ -5121,6 +5153,7 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 CFLAGS="$CFLAGS -funsigned-char"
 
 
+
 CFLAGS="$CFLAGS -Wall"
 
 ac_ext=c
@@ -5223,6 +5256,54 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Wformat-nonliteral" >&5
+$as_echo_n "checking whether C compiler accepts -Wformat-nonliteral... " >&6; }
+if ${ax_cv_check_cflags__Werror___Wformat_nonliteral+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+  ax_check_save_flags=$CFLAGS
+  CFLAGS="$CFLAGS -Werror  -Wformat-nonliteral"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ax_cv_check_cflags__Werror___Wformat_nonliteral=yes
+else
+  ax_cv_check_cflags__Werror___Wformat_nonliteral=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  CFLAGS=$ax_check_save_flags
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags__Werror___Wformat_nonliteral" >&5
+$as_echo "$ax_cv_check_cflags__Werror___Wformat_nonliteral" >&6; }
+if test x"$ax_cv_check_cflags__Werror___Wformat_nonliteral" = xyes; then :
+  CFLAGS="$CFLAGS -Wformat-nonliteral"
+else
+  :
+fi
+
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Wduplicated-cond" >&5
 $as_echo_n "checking whether C compiler accepts -Wduplicated-cond... " >&6; }
 if ${ax_cv_check_cflags__Werror___Wduplicated_cond+:} false; then :
@@ -5312,6 +5393,55 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Wparentheses" >&5
+$as_echo_n "checking whether C compiler accepts -Wparentheses... " >&6; }
+if ${ax_cv_check_cflags__Werror___Wparentheses+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+  ax_check_save_flags=$CFLAGS
+  CFLAGS="$CFLAGS -Werror  -Wparentheses"
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ax_cv_check_cflags__Werror___Wparentheses=yes
+else
+  ax_cv_check_cflags__Werror___Wparentheses=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+  CFLAGS=$ax_check_save_flags
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags__Werror___Wparentheses" >&5
+$as_echo "$ax_cv_check_cflags__Werror___Wparentheses" >&6; }
+if test x"$ax_cv_check_cflags__Werror___Wparentheses" = xyes; then :
+  CFLAGS="$CFLAGS -Wparentheses"
+else
+  :
+fi
+
+  ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+
+
 
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
@@ -5791,20 +5921,24 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
+if $CC --version | grep -q "clang version 3."; then :
+  CFLAGS="$CFLAGS -Wno-tautological-compare -Wno-pragmas"
+fi
+
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Waddress" >&5
-$as_echo_n "checking whether C compiler accepts -Waddress... " >&6; }
-if ${ax_cv_check_cflags__Werror___Waddress+:} false; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Wpragmas" >&5
+$as_echo_n "checking whether C compiler accepts -Wpragmas... " >&6; }
+if ${ax_cv_check_cflags__Werror___Wpragmas+:} false; then :
   $as_echo_n "(cached) " >&6
 else
 
   ax_check_save_flags=$CFLAGS
-  CFLAGS="$CFLAGS -Werror  -Waddress"
+  CFLAGS="$CFLAGS -Werror  -Wpragmas"
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -5817,19 +5951,19 @@ main ()
 }
 _ACEOF
 if ac_fn_c_try_compile "$LINENO"; then :
-  ax_cv_check_cflags__Werror___Waddress=yes
+  ax_cv_check_cflags__Werror___Wpragmas=yes
 else
-  ax_cv_check_cflags__Werror___Waddress=no
+  ax_cv_check_cflags__Werror___Wpragmas=no
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   CFLAGS=$ax_check_save_flags
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags__Werror___Waddress" >&5
-$as_echo "$ax_cv_check_cflags__Werror___Waddress" >&6; }
-if test x"$ax_cv_check_cflags__Werror___Waddress" = xyes; then :
-  CFLAGS="$CFLAGS -Wno-address"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags__Werror___Wpragmas" >&5
+$as_echo "$ax_cv_check_cflags__Werror___Wpragmas" >&6; }
+if test x"$ax_cv_check_cflags__Werror___Wpragmas" = xyes; then :
+  no_pragmas=1
 else
-  :
+  no_pragmas=0
 fi
 
   ac_ext=c
@@ -5838,21 +5972,20 @@ ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
-
 ac_ext=c
 ac_cpp='$CPP $CPPFLAGS'
 ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
 ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Wcast-function-type" >&5
-$as_echo_n "checking whether C compiler accepts -Wcast-function-type... " >&6; }
-if ${ax_cv_check_cflags__Werror___Wcast_function_type+:} false; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Wunknown-warning-option" >&5
+$as_echo_n "checking whether C compiler accepts -Wunknown-warning-option... " >&6; }
+if ${ax_cv_check_cflags__Werror___Wunknown_warning_option+:} false; then :
   $as_echo_n "(cached) " >&6
 else
 
   ax_check_save_flags=$CFLAGS
-  CFLAGS="$CFLAGS -Werror  -Wcast-function-type"
+  CFLAGS="$CFLAGS -Werror  -Wunknown-warning-option"
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 
@@ -5865,19 +5998,19 @@ main ()
 }
 _ACEOF
 if ac_fn_c_try_compile "$LINENO"; then :
-  ax_cv_check_cflags__Werror___Wcast_function_type=yes
+  ax_cv_check_cflags__Werror___Wunknown_warning_option=yes
 else
-  ax_cv_check_cflags__Werror___Wcast_function_type=no
+  ax_cv_check_cflags__Werror___Wunknown_warning_option=no
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   CFLAGS=$ax_check_save_flags
 fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags__Werror___Wcast_function_type" >&5
-$as_echo "$ax_cv_check_cflags__Werror___Wcast_function_type" >&6; }
-if test x"$ax_cv_check_cflags__Werror___Wcast_function_type" = xyes; then :
-  CFLAGS="$CFLAGS -Wno-cast-function-type"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags__Werror___Wunknown_warning_option" >&5
+$as_echo "$ax_cv_check_cflags__Werror___Wunknown_warning_option" >&6; }
+if test x"$ax_cv_check_cflags__Werror___Wunknown_warning_option" = xyes; then :
+  unknown_warning_option=1
 else
-  :
+  unknown_warning_option=0
 fi
 
   ac_ext=c
@@ -5887,6 +6020,14 @@ ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $
 ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
+if test "$unknown_warning_option" = "1"; then
+		CFLAGS="$CFLAGS -Wno-unknown-warning-option"
+else
+	if test "$no_pragmas" = "1"; then
+								CFLAGS="$CFLAGS -Wno-pragmas"
+	fi
+fi
+
 
 
 
@@ -6008,6 +6149,19 @@ $as_echo "#define HAVE_STRLNCAT /**/" >>confdefs.h
 fi
 done
 
+for ac_func in strlncpy
+do :
+  ac_fn_c_check_func "$LINENO" "strlncpy" "ac_cv_func_strlncpy"
+if test "x$ac_cv_func_strlncpy" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_STRLNCPY 1
+_ACEOF
+
+$as_echo "#define HAVE_STRLNCPY /**/" >>confdefs.h
+
+fi
+done
+
 
 for ac_func in getrusage
 do :
@@ -6448,29 +6602,6 @@ cat >>confdefs.h <<_ACEOF
 _ACEOF
 
 
-# Check whether --enable-prefixaq was given.
-if test "${enable_prefixaq+set}" = set; then :
-  enableval=$enable_prefixaq;
-else
-  enable_prefixaq=yes
-fi
-
-if test $enable_prefixaq = "yes"; then :
-
-$as_echo "#define PREFIX_AQ /**/" >>confdefs.h
-
-fi
-
-
-# Check whether --with-showlistmodes was given.
-if test "${with_showlistmodes+set}" = set; then :
-  withval=$with_showlistmodes; if test $withval = "yes"; then :
-
-$as_echo "#define LIST_SHOW_MODES /**/" >>confdefs.h
-
-fi
-fi
-
 
 # Check whether --with-no-operoverride was given.
 if test "${with_no_operoverride+set}" = set; then :
@@ -6524,6 +6655,14 @@ else
 fi
 
 
+# Check whether --with-system-jansson was given.
+if test "${with_system_jansson+set}" = set; then :
+  withval=$with_system_jansson;
+else
+  with_system_jansson=yes
+fi
+
+
 # Check whether --enable-ssl was given.
 if test "${enable_ssl+set}" = set; then :
   enableval=$enable_ssl;
@@ -6570,7 +6709,11 @@ $as_echo "not found" >&6; }
 	else
 		CRYPTOLIB="-lssl -lcrypto";
 		if test ! "$ssldir" = "/usr" ; then
-			LDFLAGS="$LDFLAGS -L$ssldir/lib";
+			if test -d "$ssldir/lib64" ; then
+				LDFLAGS="$LDFLAGS -L$ssldir/lib64";
+			else
+				LDFLAGS="$LDFLAGS -L$ssldir/lib";
+			fi
 						if test -f "$ssldir/bin/openssl"; then
 			    OPENSSLPATH="$ssldir/bin/openssl";
 			fi
@@ -7655,7 +7798,7 @@ fi
 
 if test "$has_system_cares" = "no"; then :
 
-cares_version="1.17.1"
+cares_version="1.17.2"
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: extracting c-ares resolver library" >&5
 $as_echo "extracting c-ares resolver library" >&6; }
 cur_dir=`pwd`
@@ -7716,6 +7859,130 @@ cd $cur_dir
 
 fi
 
+has_system_jansson="no"
+if test "x$with_system_jansson" = "xyes"; then :
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for JANSSON" >&5
+$as_echo_n "checking for JANSSON... " >&6; }
+
+if test -n "$JANSSON_CFLAGS"; then
+    pkg_cv_JANSSON_CFLAGS="$JANSSON_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"jansson >= 2.0.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "jansson >= 2.0.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_JANSSON_CFLAGS=`$PKG_CONFIG --cflags "jansson >= 2.0.0" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$JANSSON_LIBS"; then
+    pkg_cv_JANSSON_LIBS="$JANSSON_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"jansson >= 2.0.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "jansson >= 2.0.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_JANSSON_LIBS=`$PKG_CONFIG --libs "jansson >= 2.0.0" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+   	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        JANSSON_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "jansson >= 2.0.0" 2>&1`
+        else
+	        JANSSON_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "jansson >= 2.0.0" 2>&1`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$JANSSON_PKG_ERRORS" >&5
+
+	has_system_jansson=no
+elif test $pkg_failed = untried; then
+     	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	has_system_jansson=no
+else
+	JANSSON_CFLAGS=$pkg_cv_JANSSON_CFLAGS
+	JANSSON_LIBS=$pkg_cv_JANSSON_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	has_system_jansson=yes
+if test "x$PRIVATELIBDIR" != "x"; then :
+  rm -f "$PRIVATELIBDIR/"libjansson*
+fi
+fi
+fi
+
+if test "$has_system_jansson" = "no"; then :
+
+jansson_version="2.13.1"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: extracting jansson library" >&5
+$as_echo "extracting jansson library" >&6; }
+cur_dir=`pwd`
+cd extras
+rm -rf jansson-$jansson_version jansson
+if test "x$ac_cv_path_GUNZIP" = "x" ; then
+	tar xfz jansson.tar.gz
+else
+	cp jansson.tar.gz jansson.tar.gz.bak
+	gunzip -f jansson.tar.gz
+	cp jansson.tar.gz.bak jansson.tar.gz
+	tar xf jansson.tar
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: compiling jansson library" >&5
+$as_echo "compiling jansson library" >&6; }
+cd jansson-$jansson_version
+save_cflags="$CFLAGS"
+CFLAGS="$orig_cflags"
+export CFLAGS
+./configure --prefix=$cur_dir/extras/jansson --libdir=$PRIVATELIBDIR --enable-shared --disable-static --enable-opt || exit 1
+CFLAGS="$save_cflags"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: compiling jansson resolver library" >&5
+$as_echo "compiling jansson resolver library" >&6; }
+$ac_cv_prog_MAKER || exit 1
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: installing jansson resolver library" >&5
+$as_echo "installing jansson resolver library" >&6; }
+$ac_cv_prog_MAKER install || exit 1
+JANSSON_CFLAGS="-I$cur_dir/extras/jansson/include"
+
+JANSSON_LIBS=
+if test -n "$ac_cv_path_PKGCONFIG"; then :
+  JANSSON_LIBS="`$ac_cv_path_PKGCONFIG --libs jansson.pc`"
+fi
+if test -z "$JANSSON_LIBS"; then :
+  JANSSON_LIBS="-L$PRIVATELIBDIR -ljansson"
+fi
+
+cd $cur_dir
+
+fi
+
+
 # Make sure we can run config.sub.
 $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
   as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
@@ -8338,10 +8605,268 @@ rm -f core conftest.err conftest.$ac_objext \
 		LIBS="$LIBS_SAVEDA"
 		CFLAGS="$CFLAGS_SAVEDA"
 
-		URL="url.o"
+				URL="url_curl.o"
+
+else
+
+				URL="url_unreal.o"
+
+fi
+
+
+
+	# Check whether --enable-geoip_classic was given.
+if test "${enable_geoip_classic+set}" = set; then :
+  enableval=$enable_geoip_classic; enable_geoip_classic=$enableval
+else
+  enable_geoip_classic=no
+fi
+
+
+	if test "x$enable_geoip_classic" = "xyes"; then :
+
+				has_system_geoip_classic="no"
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GEOIP_CLASSIC" >&5
+$as_echo_n "checking for GEOIP_CLASSIC... " >&6; }
+
+if test -n "$GEOIP_CLASSIC_CFLAGS"; then
+    pkg_cv_GEOIP_CLASSIC_CFLAGS="$GEOIP_CLASSIC_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"geoip >= 1.6.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "geoip >= 1.6.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GEOIP_CLASSIC_CFLAGS=`$PKG_CONFIG --cflags "geoip >= 1.6.0" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$GEOIP_CLASSIC_LIBS"; then
+    pkg_cv_GEOIP_CLASSIC_LIBS="$GEOIP_CLASSIC_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"geoip >= 1.6.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "geoip >= 1.6.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GEOIP_CLASSIC_LIBS=`$PKG_CONFIG --libs "geoip >= 1.6.0" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
 
 
+if test $pkg_failed = yes; then
+   	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
 fi
+        if test $_pkg_short_errors_supported = yes; then
+	        GEOIP_CLASSIC_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "geoip >= 1.6.0" 2>&1`
+        else
+	        GEOIP_CLASSIC_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "geoip >= 1.6.0" 2>&1`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$GEOIP_CLASSIC_PKG_ERRORS" >&5
+
+	has_system_geoip_classic=no
+elif test $pkg_failed = untried; then
+     	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	has_system_geoip_classic=no
+else
+	GEOIP_CLASSIC_CFLAGS=$pkg_cv_GEOIP_CLASSIC_CFLAGS
+	GEOIP_CLASSIC_LIBS=$pkg_cv_GEOIP_CLASSIC_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	has_system_geoip_classic=yes
+		                   if test "x$PRIVATELIBDIR" != "x"; then :
+  rm -f "$PRIVATELIBDIR/"libGeoIP.*
+fi
+fi
+
+				if test "$has_system_geoip_classic" = "no"; then :
+
+						geoip_classic_version="1.6.12"
+			{ $as_echo "$as_me:${as_lineno-$LINENO}: result: extracting GeoIP Classic library" >&5
+$as_echo "extracting GeoIP Classic library" >&6; }
+			cur_dir=`pwd`
+			cd extras
+									rm -rf GeoIP-$geoip_classic_version geoip-classic
+			if test "x$ac_cv_path_GUNZIP" = "x" ; then
+				tar xfz geoip-classic.tar.gz
+			else
+				cp geoip-classic.tar.gz geoip-classic.tar.gz.bak
+				gunzip -f geoip-classic.tar.gz
+				cp geoip-classic.tar.gz.bak geoip-classic.tar.gz
+				tar xf geoip-classic.tar
+			fi
+			{ $as_echo "$as_me:${as_lineno-$LINENO}: result: configuring GeoIP Classic library" >&5
+$as_echo "configuring GeoIP Classic library" >&6; }
+			cd GeoIP-$geoip_classic_version
+			save_cflags="$CFLAGS"
+			CFLAGS="$orig_cflags"
+			export CFLAGS
+			./configure --prefix=$cur_dir/extras/geoip-classic --libdir=$PRIVATELIBDIR --enable-shared --disable-static || exit 1
+			CFLAGS="$save_cflags"
+			{ $as_echo "$as_me:${as_lineno-$LINENO}: result: compiling GeoIP Classic library" >&5
+$as_echo "compiling GeoIP Classic library" >&6; }
+			$ac_cv_prog_MAKER || exit 1
+			{ $as_echo "$as_me:${as_lineno-$LINENO}: result: installing GeoIP Classic library" >&5
+$as_echo "installing GeoIP Classic library" >&6; }
+			$ac_cv_prog_MAKER install || exit 1
+						if test -n "$ac_cv_path_PKGCONFIG"; then :
+  GEOIP_CLASSIC_LIBS="`$ac_cv_path_PKGCONFIG --libs geoip.pc`"
+			        GEOIP_CLASSIC_CFLAGS="`$ac_cv_path_PKGCONFIG --cflags geoip.pc`"
+fi
+						if test -z "$GEOIP_CLASSIC_LIBS"; then :
+  GEOIP_CLASSIC_LIBS="-L$PRIVATELIBDIR -lGeoIP"
+			        GEOIP_CLASSIC_CFLAGS="-I$cur_dir/extras/geoip-classic/include"
+fi
+			cd $cur_dir
+
+fi
+
+
+
+
+		GEOIP_CLASSIC_OBJECTS="geoip_classic.so"
+
+
+fi
+
+
+	# Check whether --enable-libmaxminddb was given.
+if test "${enable_libmaxminddb+set}" = set; then :
+  enableval=$enable_libmaxminddb; enable_libmaxminddb=$enableval
+else
+  enable_libmaxminddb=no
+fi
+
+
+	if test "x$enable_libmaxminddb" = "xyes"; then :
+
+				has_system_libmaxminddb="no"
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBMAXMINDDB" >&5
+$as_echo_n "checking for LIBMAXMINDDB... " >&6; }
+
+if test -n "$LIBMAXMINDDB_CFLAGS"; then
+    pkg_cv_LIBMAXMINDDB_CFLAGS="$LIBMAXMINDDB_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libmaxminddb >= 1.4.3\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "libmaxminddb >= 1.4.3") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_LIBMAXMINDDB_CFLAGS=`$PKG_CONFIG --cflags "libmaxminddb >= 1.4.3" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$LIBMAXMINDDB_LIBS"; then
+    pkg_cv_LIBMAXMINDDB_LIBS="$LIBMAXMINDDB_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libmaxminddb >= 1.4.3\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "libmaxminddb >= 1.4.3") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_LIBMAXMINDDB_LIBS=`$PKG_CONFIG --libs "libmaxminddb >= 1.4.3" 2>/dev/null`
+		      test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+   	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        LIBMAXMINDDB_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libmaxminddb >= 1.4.3" 2>&1`
+        else
+	        LIBMAXMINDDB_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libmaxminddb >= 1.4.3" 2>&1`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$LIBMAXMINDDB_PKG_ERRORS" >&5
+
+	as_fn_error $? "Package requirements (libmaxminddb >= 1.4.3) were not met:
+
+$LIBMAXMINDDB_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables LIBMAXMINDDB_CFLAGS
+and LIBMAXMINDDB_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details." "$LINENO" 5
+elif test $pkg_failed = untried; then
+     	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables LIBMAXMINDDB_CFLAGS
+and LIBMAXMINDDB_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.
+See \`config.log' for more details" "$LINENO" 5; }
+else
+	LIBMAXMINDDB_CFLAGS=$pkg_cv_LIBMAXMINDDB_CFLAGS
+	LIBMAXMINDDB_LIBS=$pkg_cv_LIBMAXMINDDB_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	has_system_libmaxminddb=yes
+fi
+		if test "x$has_system_libmaxminddb" = "xyes"; then :
+
+
+
+
+
+			GEOIP_MAXMIND_OBJECTS="geoip_maxmind.so"
+
+
+fi
+
+fi
+
 
 UNRLINCDIR="`pwd`/include"
 
@@ -8358,7 +8883,7 @@ fi
 
 
 
-ac_config_files="$ac_config_files Makefile src/Makefile src/modules/Makefile src/modules/chanmodes/Makefile src/modules/usermodes/Makefile src/modules/snomasks/Makefile src/modules/extbans/Makefile src/modules/third/Makefile extras/unrealircd-upgrade-script unrealircd"
+ac_config_files="$ac_config_files Makefile src/Makefile src/modules/Makefile src/modules/chanmodes/Makefile src/modules/usermodes/Makefile src/modules/extbans/Makefile src/modules/third/Makefile extras/unrealircd-upgrade-script unrealircd"
 
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
@@ -8866,7 +9391,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by unrealircd $as_me 5.2.0.1, which was
+This file was extended by unrealircd $as_me 6.0.1.1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -8929,7 +9454,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-unrealircd config.status 5.2.0.1
+unrealircd config.status 6.0.1.1
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
@@ -9056,7 +9581,6 @@ do
     "src/modules/Makefile") CONFIG_FILES="$CONFIG_FILES src/modules/Makefile" ;;
     "src/modules/chanmodes/Makefile") CONFIG_FILES="$CONFIG_FILES src/modules/chanmodes/Makefile" ;;
     "src/modules/usermodes/Makefile") CONFIG_FILES="$CONFIG_FILES src/modules/usermodes/Makefile" ;;
-    "src/modules/snomasks/Makefile") CONFIG_FILES="$CONFIG_FILES src/modules/snomasks/Makefile" ;;
     "src/modules/extbans/Makefile") CONFIG_FILES="$CONFIG_FILES src/modules/extbans/Makefile" ;;
     "src/modules/third/Makefile") CONFIG_FILES="$CONFIG_FILES src/modules/third/Makefile" ;;
     "extras/unrealircd-upgrade-script") CONFIG_FILES="$CONFIG_FILES extras/unrealircd-upgrade-script" ;;
diff --git a/configure.ac b/configure.ac
@@ -7,7 +7,7 @@ dnl src/windows/unrealinst.iss
 dnl doc/Config.header
 dnl src/version.c.SH
 
-AC_INIT([unrealircd], [5.2.0.1], [https://bugs.unrealircd.org/], [], [https://unrealircd.org/])
+AC_INIT([unrealircd], [6.0.1.1], [https://bugs.unrealircd.org/], [], [https://unrealircd.org/])
 AC_CONFIG_SRCDIR([src/ircd.c])
 AC_CONFIG_HEADER([include/setup.h])
 AC_CONFIG_AUX_DIR([autoconf])
@@ -26,15 +26,15 @@ BUILDDIR_NOW="`pwd`"
 
 dnl Calculate the versions. Perhaps the use of expr is a little too extravagant
 # Generation version number (e.g.: X in X.Y.Z)
-UNREAL_VERSION_GENERATION=["5"]
+UNREAL_VERSION_GENERATION=["6"]
 AC_DEFINE_UNQUOTED([UNREAL_VERSION_GENERATION], [$UNREAL_VERSION_GENERATION], [Generation version number (e.g.: X for X.Y.Z)])
 
 # Major version number (e.g.: Y in X.Y.Z)
-UNREAL_VERSION_MAJOR=["2"]
+UNREAL_VERSION_MAJOR=["0"]
 AC_DEFINE_UNQUOTED([UNREAL_VERSION_MAJOR], [$UNREAL_VERSION_MAJOR], [Major version number (e.g.: Y for X.Y.Z)])
 
 # Minor version number (e.g.: Z in X.Y.Z)
-UNREAL_VERSION_MINOR=["0"]
+UNREAL_VERSION_MINOR=["1"]
 AC_DEFINE_UNQUOTED([UNREAL_VERSION_MINOR], [$UNREAL_VERSION_MINOR], [Minor version number (e.g.: Z for X.Y.Z)])
 
 # The version suffix such as a beta marker or release candidate
@@ -189,18 +189,26 @@ CFLAGS="$CFLAGS -funsigned-char"
 
 dnl Compiler -W checks...
 
+dnl == ADD THESE WARNINGS ==
+
 dnl We should be able to turn this on unconditionally:
 CFLAGS="$CFLAGS -Wall"
 
 dnl More warnings (if the compiler supports it):
 check_cc_flag([-Wextra], [CFLAGS="$CFLAGS -Wextra"])
 check_cc_flag([-Waggregate-return], [CFLAGS="$CFLAGS -Waggregate-return"])
+check_cc_flag([-Wformat-nonliteral], [CFLAGS="$CFLAGS -Wformat-nonliteral"])
+
 dnl The following few are more experimental, if they have false positives we'll have
 dnl to disable them:
 dnl Can't use this, too bad: check_cc_flag([-Wlogical-op], [CFLAGS="$CFLAGS -Wlogical-op"])
 check_cc_flag([-Wduplicated-cond], [CFLAGS="$CFLAGS -Wduplicated-cond"])
 check_cc_flag([-Wduplicated-branches], [CFLAGS="$CFLAGS -Wduplicated-branches"])
 
+check_cc_flag([-Wparentheses], [CFLAGS="$CFLAGS -Wparentheses"])
+
+dnl == REMOVE THESE WARNINGS ==
+
 dnl And now to filter out certain warnings:
 dnl [!] NOTE REGARDING THE check_cc_flag used by these:
 dnl We check for the -Woption even though we are going to use -Wno-option.
@@ -247,12 +255,31 @@ check_cc_flag([-Wsign-compare], [CFLAGS="$CFLAGS -Wno-sign-compare"])
 dnl Don't warn about empty body, we use this, eg via Debug(()) or in if's.
 check_cc_flag([-Wempty-body], [CFLAGS="$CFLAGS -Wno-empty-body"])
 
-dnl This one fails with ircstrdup(var, staticstring)
-dnl Shame we have to turn it off completely...
-check_cc_flag([-Waddress], [CFLAGS="$CFLAGS -Wno-address"])
-
-dnl This one breaks our TO_INTFUNC() that is used in m_tkl for tkl_typetochar
-check_cc_flag([-Wcast-function-type], [CFLAGS="$CFLAGS -Wno-cast-function-type"])
+dnl Yeah this old clang version is a bit problematic
+dnl (ships in Ubuntu 16.04 for example)
+dnl -Wtautological-compare has false positives
+dnl -Wno-pragmas is needed, despite -Wno-unknown-warning-option
+AS_IF([$CC --version | grep -q "clang version 3."],
+        [CFLAGS="$CFLAGS -Wno-tautological-compare -Wno-pragmas"])
+
+dnl This one MUST be LAST!!
+dnl It disables -Wsomeunknownoption being an error. Which is needed for
+dnl the pragma's in individual files to selectively disable some warnings
+dnl on clang/gcc (that may exist in eg gcc but not in clang or vice versa).
+check_cc_flag([-Wpragmas], [no_pragmas=1],[no_pragmas=0])
+check_cc_flag([-Wunknown-warning-option], [unknown_warning_option=1], [unknown_warning_option=0])
+
+if test "$unknown_warning_option" = "1"; then
+	dnl This is the best option
+	CFLAGS="$CFLAGS -Wno-unknown-warning-option"
+else
+	if test "$no_pragmas" = "1"; then
+		dnl This is a fallback needed for older gcc/clang, it also
+		dnl disables several other useful warnings/errors related
+		dnl to pragma's unfortunately.
+		CFLAGS="$CFLAGS -Wno-pragmas"
+	fi
+fi
 
 dnl End of -W... compiler checks.
 
@@ -352,6 +379,8 @@ AC_CHECK_FUNCS(strlcat,
 	AC_DEFINE([HAVE_STRLCAT], [], [Define if you have strlcat]))
 AC_CHECK_FUNCS(strlncat,
 	AC_DEFINE([HAVE_STRLNCAT], [], [Define if you have strlncat]))
+AC_CHECK_FUNCS(strlncpy,
+	AC_DEFINE([HAVE_STRLNCPY], [], [Define if you have strlncpy]))
 
 AC_CHECK_FUNCS([getrusage],
 	[AC_DEFINE([GETRUSAGE_2], [], [Define if you have getrusage])],
@@ -492,17 +521,6 @@ AC_ARG_WITH(maxconnections, [AS_HELP_STRING([--with-maxconnections=size], [Speci
 	[ac_fd=0])
 AC_DEFINE_UNQUOTED([MAXCONNECTIONS_REQUEST], [$ac_fd], [Set to the maximum number of connections you want])
 
-AC_ARG_ENABLE([prefixaq],
-	[AS_HELP_STRING([--disable-prefixaq],[Disable chanadmin (+a) and chanowner (+q) prefixes])],
-	[],
-	[enable_prefixaq=yes])
-AS_IF([test $enable_prefixaq = "yes"],
-	[AC_DEFINE([PREFIX_AQ], [], [Define if you want +a/+q prefixes])])
-
-AC_ARG_WITH(showlistmodes,
-	[AS_HELP_STRING([--with-showlistmodes], [Specify whether modes are shown in /list])],
-	[AS_IF([test $withval = "yes"],
-		[AC_DEFINE([LIST_SHOW_MODES], [], [Define if you want modes shown in /list])])])
 AC_ARG_WITH(no-operoverride, [AS_HELP_STRING([--with-no-operoverride], [Disable OperOverride])],
 	[AS_IF([test $withval = "yes"],
 		[AC_DEFINE([NO_OPEROVERRIDE], [], [Define if you want OperOverride disabled])])])
@@ -513,6 +531,7 @@ AC_ARG_WITH(system-pcre2, [AS_HELP_STRING([--without-system-pcre2], [Use the sys
 AC_ARG_WITH(system-argon2, [AS_HELP_STRING([--without-system-argon2], [Use bundled version instead of system argon2 library. Normally autodetected via pkg-config])], [], [with_system_argon2=yes])
 AC_ARG_WITH(system-sodium, [AS_HELP_STRING([--without-system-sodium], [Use bundled version instead of system sodium library. Normally autodetected via pkg-config])], [], [with_system_sodium=yes])
 AC_ARG_WITH(system-cares, [AS_HELP_STRING([--without-system-cares], [Use bundled version instead of system c-ares. Normally autodetected via pkg-config.])], [], [with_system_cares=yes])
+AC_ARG_WITH(system-jansson, [AS_HELP_STRING([--without-system-jansson], [Use bundled version instead of system jansson. Normally autodetected via pkg-config.])], [], [with_system_jansson=yes])
 CHECK_SSL
 CHECK_SSL_CTX_SET1_CURVES_LIST
 CHECK_SSL_CTX_SET_MIN_PROTO_VERSION
@@ -697,7 +716,7 @@ AS_IF([test "$has_system_cares" = "no"], [
 dnl REMEMBER TO CHANGE WITH A NEW C-ARES RELEASE!
 dnl NOTE: when changing this here, ALSO change it in extras/curlinstall
 dnl       and in the comment in this file around line 400!
-cares_version="1.17.1"
+cares_version="1.17.2"
 AC_MSG_RESULT(extracting c-ares resolver library)
 cur_dir=`pwd`
 cd extras
@@ -763,10 +782,65 @@ AC_SUBST(CARES_LIBS)
 cd $cur_dir
 ])
 
+dnl Use system jansson when available, unless --without-system-jansson
+has_system_jansson="no"
+AS_IF([test "x$with_system_jansson" = "xyes"],[
+PKG_CHECK_MODULES([JANSSON], [jansson >= 2.0.0],[has_system_jansson=yes
+AS_IF([test "x$PRIVATELIBDIR" != "x"], [rm -f "$PRIVATELIBDIR/"libjansson*])],[has_system_jansson=no])])
+
+AS_IF([test "$has_system_jansson" = "no"],[
+dnl REMEMBER TO CHANGE WITH A NEW JANSSON RELEASE!
+jansson_version="2.13.1"
+AC_MSG_RESULT(extracting jansson library)
+cur_dir=`pwd`
+cd extras
+dnl remove old jansson directory to force a recompile...
+dnl and remove its installation prefix just to clean things up.
+rm -rf jansson-$jansson_version jansson
+if test "x$ac_cv_path_GUNZIP" = "x" ; then
+	tar xfz jansson.tar.gz
+else
+	cp jansson.tar.gz jansson.tar.gz.bak
+	gunzip -f jansson.tar.gz
+	cp jansson.tar.gz.bak jansson.tar.gz
+	tar xf jansson.tar
+fi
+AC_MSG_RESULT(compiling jansson library)
+cd jansson-$jansson_version
+save_cflags="$CFLAGS"
+CFLAGS="$orig_cflags"
+export CFLAGS
+./configure --prefix=$cur_dir/extras/jansson --libdir=$PRIVATELIBDIR --enable-shared --disable-static --enable-opt || exit 1
+CFLAGS="$save_cflags"
+AC_MSG_RESULT(compiling jansson resolver library)
+$ac_cv_prog_MAKER || exit 1
+AC_MSG_RESULT(installing jansson resolver library)
+$ac_cv_prog_MAKER install || exit 1
+JANSSON_CFLAGS="-I$cur_dir/extras/jansson/include"
+AC_SUBST(JANSSON_CFLAGS)
+JANSSON_LIBS=
+dnl See c-ares's compilation section for more info on this hack.
+dnl ensure that we're linking against the bundled version
+dnl (we only reach this code if linking against the bundled version is desired).
+AS_IF([test -n "$ac_cv_path_PKGCONFIG"],
+       [JANSSON_LIBS="`$ac_cv_path_PKGCONFIG --libs jansson.pc`"])
+dnl ^^^ FIXME FIXME this is likely incorrect the .pc etc
+dnl For when pkg-config isn't available
+AS_IF([test -z "$JANSSON_LIBS"],
+       [JANSSON_LIBS="-L$PRIVATELIBDIR -ljansson"])
+AC_SUBST(JANSSON_LIBS)
+cd $cur_dir
+])
+
+
 AX_PTHREAD()
 
 CHECK_LIBCURL
 
+CHECK_GEOIP_CLASSIC
+
+CHECK_LIBMAXMINDDB
+
 UNRLINCDIR="`pwd`/include"
 
 dnl Moved to the very end to ensure it doesn't affect any libs or tests.
@@ -789,7 +863,6 @@ AC_CONFIG_FILES([Makefile
 	src/modules/Makefile
 	src/modules/chanmodes/Makefile
 	src/modules/usermodes/Makefile
-	src/modules/snomasks/Makefile
 	src/modules/extbans/Makefile
 	src/modules/third/Makefile
 	extras/unrealircd-upgrade-script
diff --git a/doc/Config.header b/doc/Config.header
@@ -7,7 +7,7 @@
  \___/|_| |_|_|  \___|\__,_|_|\___/\_| \_| \____/\__,_|
 
                                Configuration Program
-                                for UnrealIRCd 5.2.0.1
+                                for UnrealIRCd 6.0.1.1
                                     
 This program will help you to compile your IRC server, and ask you
 questions regarding the compile-time settings of it during the process. 
@@ -16,15 +16,15 @@ A short installation guide is available online at:
 https://www.unrealircd.org/docs/Installing_from_source
 
 Full documentation is available at:
-https://www.unrealircd.org/docs/UnrealIRCd_5_documentation
+https://www.unrealircd.org/docs/UnrealIRCd_6_documentation
 
 --------------------------------------------------------------------------------------
 
 The full release notes are available in doc/RELEASE-NOTES.md
 For easier viewing, check out the latest online release notes at:
-https://github.com/unrealircd/unrealircd/blob/unreal52/doc/RELEASE-NOTES.md
+https://github.com/unrealircd/unrealircd/blob/unreal60_dev/doc/RELEASE-NOTES.md
 
-UnrealIRCd 5 is compatible with the following services:
+UnrealIRCd 6 is compatible with the following services:
 * anope with the "unreal4" protocol module - version 2.0.7 or higher required!
 * atheme with the "unreal4" protocol module - tested with version 7.2.9
 
diff --git a/doc/RELEASE-NOTES.md b/doc/RELEASE-NOTES.md
@@ -1,1000 +1,254 @@
-UnrealIRCd 5.2.0.1 Release Notes
-=================================
-
-About 5.2.0.1
---------------
-5.2.0.1 fixes an issue with spamfilter that was present in 5.2.0.
-In channels spamfilters were processed for type ```p``` instead of ```c```.
-Existing 5.2.0 users on *NIX can upgrade without restart by running
-```./unrealircd hot-patch wrongspamfilter520```
-
-UnrealIRCd 5.2.0 is out!
--------------------------
-
-This is UnrealIRCd 5.2.0, a release with lots of new features.
-The two main new features are: an improved and more flexible anti-flood block
-and channel history which can now be stored encrypted on disk and allows
-clients to fetch hundreds/thousands of lines.
-
-Upgrading and the 5.0.x series
--------------------------------
-UnrealIRCd 5.2.0 is the direct successor to 5.0.9/5.0.9.1.
-There will be [no further 5.0.x releases](https://www.unrealircd.org/docs/FAQ#About_the_new_5.2.x_series),
-in particular there will be no 5.0.10.
-
-Only four bugs that affect a limited number of people/networks were fixed.
-UnrealIRCd 5.2.0 is mostly a feature release.
-Admins wishing to take a conservative approach don't need to rush an
-upgrade from 5.0.x to 5.2.0, they can wait for a 5.2.1 or 5.2.2 release.
-
-If you are upgrading from 5.0.9(.1) to 5.2.0 then feel free to try the new
-```./unrealircd upgrade``` command.
-
-The only configuration change is in the set::anti-flood block (as explained
-further down under *Enhancements*). When starting UnrealIRCd will give you
-clear instructions if anything needs to be changed (and what).
-This process is really minor, the server will usually tell you to just
-delete a few old lines from the configuration file.
-
-Enhancements
--------------
-* The set::anti-flood block has been redone so you can have different limits
-  for *unknown-users* and *known-users*.
-  * As a reminder, by default, *known-users* are users who are identified
-    to services OR are on an IP that has been connected for over 2 hours
-    in the past X days. The exact definition of "known-users" is in the
-    [security-group block](https://www.unrealircd.org/docs/Security-group_block).
-  * See [here](https://www.unrealircd.org/docs/Anti-flood_settings)
-    for more information on the layout of the new set::anti-flood block.
-  * All violations of target-flood, nick-flood, join-flood, away-flood,
-    invite-flood, knock-flood, max-concurrent-conversations are now
-    reported to opers with the snomask ```f``` (flood).
-* Add support for database encryption. The way this works
-  is that you define an encryption password in a
-  [secret { } block](https://www.unrealircd.org/docs/Secret_block).
-  Then from the various modules you can refer to this secret
-  block, from
-  [set::reputation::db-secret](https://www.unrealircd.org/docs/Set_block#set::reputation),
-  [set::tkldb::db-secret](https://www.unrealircd.org/docs/Set_block#set::tkldb)
-  and [set::channeldb::db-secret](https://www.unrealircd.org/docs/Set_block#set::channeldb).
-  This way you can encrypt the reputation, TKL and channel
-  database for increased privacy.
-* Add optional support for
-  [persistent channel history](https://www.unrealircd.org/docs/Set_block#Persistent_channel_history):
-  * This stores channel history on disk for channels that have
-    both ```+H``` and ```+P``` set.
-  * If you enable this then we ALWAYS require you to set an
-    encryption password, as we do not allow storing of
-    channel history in plain text.
-  * If you enable the option, then the history is stored in
-    ```data/history/``` in individual .db files. No channel
-    names are visible in the filenames for optimal privacy.
-  * See [Persistent channel history](https://www.unrealircd.org/docs/Set_block#Persistent_channel_history)
-    on how to enable this. By default it is off.
-* Add support for IRCv3
-  [draft/chathistory](https://ircv3.net/specs/extensions/chathistory).
-* The maximums for channel mode ```+H``` have been raised and are now
-  different for ```+r``` (registered) and ```-r``` channels. For unregistered
-  channels the limit is now 200 lines / 31 days. For registered channels
-  the limit is 5000 lines / 31 days. The old limit for both was 200 lines / 7 days.
-  These maximums can be changed in the now slightly different
-  [set::history::channel::max-storage-per-channel](https://www.unrealircd.org/docs/Set_block#set::history)
-  block.
-* Add c-ares and libsodium version output to boot screen and /VERSION.
-* WHOX now supports displaying the
-  [reputation score](https://www.unrealircd.org/docs/Reputation_score).
-  If you are an IRCOp then you can use e.g. ```WHO * %cuhsnfmdaRr```.
-* Add ability to [spamfilter](https://www.unrealircd.org/docs/Spamfilter)
-  message tags via the new ```T``` target. Right now it would be unusual
-  to use this, but some day when we have more
-  [message tags](https://www.unrealircd.org/docs/Message_tags) it
-  may come in handy.
-* Support [```+draft/reply```](https://ircv3.net/specs/client-tags/reply) IRCv3
-  client tag. Can be used by bots (and others) to indicate to what message
-  people are replying to. This module, reply-tag, is loaded by default.
-* Send [```draft/bot```](https://ircv3.net/specs/extensions/bot-mode) IRCv3
-  message tag if the user has mode ```+B``` set.
-* [Websockets](https://www.unrealircd.org/docs/WebSocket_support):
-  add support for clients to negotiate an explicit type via
-  ```Sec-WebSocket-Protocol```, instead of only the default type from
-  [listen::websocket::type](https://www.unrealircd.org/docs/WebSocket_support#2._Enable_websocket_on_the_port).
-  This is based on an IRCv3 websocket draft specification.
-  Note that UnrealIRCd refuses type text if your configuration allows
-  non-UTF8 characters in channel or nick names because it would lead
-  to security and compatibility issues.
-* [set::restrict-commands](https://www.unrealircd.org/docs/Set_block#set::restrict-commands):
-  new option *exempt-tls* which allows SSL/TLS users to bypass a restriction.
-
-Fixes
-------
-* Server squiting the wrong side. Often harmless, but when (re)connecting
-  rapidly to multiple servers with autoconnect this could cause the
-  network to fall apart.
-* Forbid using [extended server bans](https://www.unrealircd.org/docs/Extended_server_bans)
-  in ZLINE/GZLINE since they won't work there.
-* Extended server ban ```~a:accname``` was not working for shun, and only
-  partially working for kline/gline.
-* More accurate /ELINE error message.
-
-Changed
---------
-* Channel mode ```+H``` always showed time in minutes (```m```) until now.
-  From now on it will show it in minutes (```m```), hours (```h```) or
-  days (```d```) depending on the actual value. Eg ```+H 50:7d```.
-* If you ran ```./unrealircd stop``` we used to wait only 1 second.
-  From now on we will wait up to 10 seconds max. This gives UnrealIRCd
-  plenty of time to write database files.
-* If you have zero [log blocks](https://www.unrealircd.org/docs/Log_block)
-  then we already automatically logged errors to ```ircd.log```.
-  From now on we will log everything (not only errors) to that file.
-
-Removed
---------
-* Version check for curl and openssl as nowadays they have ABI guarantees.
-
-Module coders / Developers
----------------------------
-* New UnrealDB API and disk format, see
-  https://www.unrealircd.org/docs/Dev:UnrealDB
-* We now use libsodium for file encryption routines as well
-  as some helpers to lock/clear passwords in memory.
-* Updated ```HOOKTYPE_LOCAL_NICKCHANGE``` and
-  ```HOOKTYPE_REMOTE_NICKCHANGE``` to include an
-  ```MessageTag *mtags``` argument in the middle.
-  You can use ```#if UNREAL_VERSION_TIME>=202115``` to detect this.
-* Updated channel mode ```conv_param``` function to
-  include a ```Channel *channel``` argument at the end.
-  You can use ```#if UNREAL_VERSION_TIME>=202120``` to detect this.
-* New: ```ModuleSetOptions(modinfo->handle, MOD_OPT_UNLOAD_PRIORITY, priority);```.
-  This can be used for modules to indicate they wish to be unloaded
-  before or after others. It is used by for example the channel
-  and history modules so they can save their databases before
-  channel mode modules or other modules get unloaded.
-* New CAP [```draft/chathistory```](https://ircv3.net/specs/extensions/chathistory).
-  If a client REQ's this CAP then UnrealIRCd won't send history on-join as
-  it assumes the client will fetch it when they feel the need for it.
-* New informative CAP:
-  [```unrealircd.org/history-backend```](https://www.unrealircd.org/history-backend)
-
-Reminder: UnrealIRCd 4 is no longer supported
-----------------------------------------------
-
-UnrealIRCd 4.x is [no longer supported](https://www.unrealircd.org/docs/UnrealIRCd_4_EOL).
-Admins must [upgrade to UnrealIRCd 5](https://www.unrealircd.org/docs/Upgrading_from_4.x).
-
-UnrealIRCd 5.0.9.1
--------------------
-The only change between 5.0.9 and 5.0.9.1 is:
-* Build improvements on *NIX (faster compiling and lower memory requirements)
-* Windows version is unchanged and still 5.0.9
-
-UnrealIRCd 5.0.9
------------------
-The 5.0.9 release comes with several nice feature enhancements. There are no major bug fixes.
-
-Enhancements:
-* Changes to the "Client connecting" notice on IRC (for IRCOps):
-  * The format changed slightly, instead of ```{clients}``` it
-    now shows ```[class: clients]```
-  * SSL/TLS information is still shown via ```[secure]```
-  * New: ```[reputation: NNN]``` to show the current
-    [reputation score](https://www.unrealircd.org/docs/Reputation_score)
-  * New: ```[account: abcdef]``` to show the services account,
-    but only if [SASL](https://www.unrealircd.org/docs/SASL) was used.
-* In the log file the format also changed slightly:
-  * IP information is now added as ```[127.0.0.1]``` in both the
-    connect and disconnect log messages.
-  * The vhost is logged as ```[vhost: xyz]``` instead of ```[VHOST xyz]```
-  * All the other values are now logged as well on-connect,
-    similar to the "Client connecting" notice, so: secure, reputation,
-    account (if applicable).
-* New option [allow::global-maxperip](https://www.unrealircd.org/docs/Allow_block):
-  this imposes a global (network-wide) restriction on the number of
-  connections per IP address.
-  If you don't have a global-maxperip setting in the allow block then it
-  will default to maxperip plus one. So, if you currently have an
-  allow::maxperip of 3 then global-maxperip will be 4.
-* [Handshake delay](https://www.unrealircd.org/docs/Set_block#set::handshake-delay)
-  is automatically disabled for users that are exempt from blacklist checking.
-* Always exempt 127.* from gline, kline, etc.
-* You can now have dated logfiles thanks to strftime formatting.
-  For example ```log "ircd.%Y-%m-%d.log" { }``` will create a log
-  file like called ircd.2020-01-31.log, a new one every day.
-* The Windows build now supports TLSv1.3 too.
+UnrealIRCd 6.0.1.1
+===================
+If you are already running UnrealIRCd 6 then read below on the 
+changes between 6.0.0 and 6.0.1(.1). Otherwise, jump straight to the
+[summary about UnrealIRCd 6](#Summary) to learn more about UnrealIRCd 6.
 
 Fixes:
-* Windows: some warnings and error messages on boot were previously
-  missing.
-
-Changes:
-* Add ```doc/KEYS``` which contains the public key(s) used to sign UnrealIRCd releases
-* The options set::anti-flood::unknown-flood-* have been renamed and
-integrated in a new block called
-[set::anti-flood::handshake-data-flood](https://www.unrealircd.org/docs/Set_block#set::anti-flood::handshake-data-flood).
-The ban-action can now also be changed. Note that almost nobody will have to
-change this setting since it has a good default.
-* On *NIX bump the default maximum connections from 8192 to 16384.
-That is, when in "auto" mode, which is like for 99% of the users.
-Note that the system may still limit the actual number of connections
-to a lower value, epending on the value of ```ulimit -n -H```.
-
-UnrealIRCd 5.0.8
------------------
-
-The main purpose of this release is to enhance the
-[reputation](https://www.unrealircd.org/docs/Reputation_score)
-functionality. There have also been some other changes and minor
-bug fixes. For more information, see below.
-
-Enhancements:
-* Support for [security groups](https://www.unrealircd.org/docs/Security-group_block),
-  of which four groups always exist by default: known-users, unknown-users,
-  tls-users and tls-and-known-users.
-* New extended ban ```~G:securitygroupname```. Typical usage would be
-  ```MODE #chan +b ~G:unknown-users``` which will ban all users from the
-  channel that are not identified to services and have a reputation
-  score below 25 (by default). The exact settings can be tweaked in the
-  [security group block](https://www.unrealircd.org/docs/Security-group_block).
-* The reputation command (IRCOp-only) has been extended to make it
-  easier to look for potential troublemakers:
-  * ```REPUTATION Nick``` shows reputation about the nick name
-  * ```REPUTATION IP``` shows reputation about the IP address
-  * ```REPUTATION #channel``` lists users in channel with their reputation score
-  * ```REPUTATION <NN``` lists users with reputation scores below value NN
-* Only send the first 1000 matches on ```STATS gline``` or a
-  similar command. This to prevent the IRCOp from being flooded off.
-  This value can be changed via
-  [set::max-stats-matches](https://www.unrealircd.org/docs/Set_block#set::max-stats-matches)
-* Warn when the SSL/TLS server certificate is expired or expires soon
-  (within 7 days).
-* New option allow::options::reject-on-auth-failure if you want to
-  stop matching on a passworded allow block, see the
-  [allow password documentation](https://www.unrealircd.org/docs/Allow_block#password)
-  for more information. Note that most people won't use this.
-
-Fixes:
-* The ```WHO``` command searched on nick name even if it was told
-  to search on a specific account name via WHOX options.
-* Some typos in the Config script and a warning
-* Counting clients twice in some circumstances
-
-Changes:
-* Support for $(DESTDIR) in 'make install' if packaging for a distro
-* Mention the ban reason in Q-line server notices
-* Add self-test to module manager and improve the error message in case
-  the IRCd source directory does not exist.
-* Print out a more helpful error if you run the unrealircd binary
-  rather than the unrealircd script with an argument like 'mkpasswd' etc.
-* On *NIX create a symlink 'source' to the UnrealIRCd source
-
-Module coders / Developers:
-* The [Doxygen module API docs](https://www.unrealircd.org/api/5/index.html)
-  have been improved, in particular the 
-  [Hook API](https://www.unrealircd.org/api/5/group__HookAPI.html)
-  is now 100% documented.
-
-UnrealIRCd 5.0.7
------------------
-
-UnrealIRCd 5.0.7 consists mainly of fixes for the 5.x stable series,
-with some minor enhancements.
-
-Enhancements:
-* Add support for ```estonian-utf8```, ```latvian-utf8``` and
-  ```lithuanian-utf8``` in
-  [set::allowed-nickchars](https://www.unrealircd.org/docs/Nick_Character_Sets)
-* Add [message tags](https://www.unrealircd.org/docs/Message_tags)
-  to ```PONG``` to help fix timestamp issues in KiwiIRC.
-* Dutch helpop file (conf/help/help.nl.conf)
-
-Fixes:
-* When having multiple text bans (```+b ~T:censor```), these caused an empty
-  message.
-* Text bans are now no longer bypassed by voiced users (```+v```).
-* [Websockets](https://www.unrealircd.org/docs/WebSocket_support) that used
-```labeled-response``` sometimes received multiple IRC messages in one
-websocket packet.
-* The reputation score of [WEBIRC users](https://www.unrealircd.org/docs/WebIRC_block)
-  was previously the score of the WEBIRC IP rather than the end-user IP.
-* ```STATS badword``` was not working.
-* When setting a very high channel limit, it showed a weird MODE ```+l``` value.
-* The ```LINKS``` command worked, even when disabled via
-  ```hideserver::disable-links``` in the optional hideserver module.
-* In some cases ```WHO``` did not show your own entry, such as when
-  searching on account name, which was confusing.
-* Memory leak when repeatedly using ```./unrealircd reloadtls``` or
-  ```/REHASH -tls```.
-
-Module coders / Developers:
-* No changes, only some small additions to the
-[Doxygen module API docs](https://www.unrealircd.org/api/5/index.html)
-
-UnrealIRCd 5.0.6
------------------
-
-UnrealIRCd 5.0.6 is a small maintenance release for the stable 5.x series.
-For existing 5.x users there is probably little reason to upgrade.
+* In 6.0.1.1: extended bans were not properly synced between U5 and U6.
+  This caused missing extended bans on the U5 side (MODE was working OK,
+  this only happened when linking servers)
+* Text extbans did not have any effect (`+b ~text:censor:*badword*`)
+* Timed bans were not expiring if all servers on the network were on U6
+* Channel mode `+f` could place a timed extban with `~t` instead of `~time`
+* Crash when unloading any of the vhoaq modules at runtime
+* `./unrealircd upgrade` not working on FreeBSD and not with self-compiled cURL
+* Some log messages being wrong (`CHGIDENT`, `CHGNAME`)
+* Remove confusing high cpu load warning
 
 Enhancements:
-* Spanish help conf was added (conf/help/help.es.conf)
-
-Fixes:
-* History playback on join was not obeying the limits from
-  [set::history::channel::playback-on-join](https://www.unrealircd.org/docs/Set_block#set::history).
-  Note that if you want to see more lines, there is the ```HISTORY```
-  command. For more information on the different ways to retrieve history, see
-  [Channel History](https://www.unrealircd.org/docs/Channel_history)
-* [Spamfilter](https://www.unrealircd.org/docs/Spamfilter) with the
-  ['tempshun' action](https://www.unrealircd.org/docs/Actions) was letting
-  the message through.
-* In very specific circumstances a ```REHASH -tls``` would cause outgoing
-  linking to fail with the error "called a function you should not call".
-* Crash if empty [set::cloak-method](https://www.unrealircd.org/docs/Set_block#set::cloak-method)
-* Issues with labeled-response on websockets (partial fix)
+* Error on unknown snomask in set::snomask-on-oper and oper::snomask.
+* TKL add/remove/expire messages now show `[duration: 60m]` instead of
+  the `[expires: ZZZ GMT]` string since that is what people are more
+  interested in and is not affected by time zones. The format in all the
+  3 notices is also consistent now.
 
-Module coders / Developers:
-* In ```RPL_ISUPPORT``` we now announce ```BOT=B``` to indicate the user mode and
-  ```WHO``` status flag for bots.
-* ```HOOKTYPE_ACCOUNT_LOGIN``` is called for remote users too now (also on server syncs)
-* Send ```RPL_LOGGEDOUT``` when logging out of services account
-* Fix double batch in message tags when using both labeled-response
-  and the ```HISTORY``` command
-
-UnrealIRCd 5.0.5.1
--------------------
-
-5.0.5.1 reverts the previously introduced UTF8 Spamfilter support.
-Unfortunately we had to do this, due to a bug in the PCRE2 regex library
-that caused a freeze / infinite loop with certain regexes and text.
-
-UnrealIRCd 5.0.5
+UnrealIRCd 6.0.0
 -----------------
 
-This 5.0.5 release mainly focuses on new features, while also fixing a few bugs.
-
-Fixes:
-* [except ban { }](https://www.unrealircd.org/docs/Except_ban_block)
-  without 'type' was not exempting from gline.
-* Channel mode ```+L #forward``` and ```+k key```: should forward
-  on wrong key, but was also redirecting on correct key.
-* Crash on 32-bit machines in tkldb (on start or rehash)
-* Crash when saving channeldb when a parameter channel mode is combined
-  with ```+P``` and that module was loaded after channeldb. This may
-  happen if you use 3rd party modules that add parameter channel modes.
-
-Enhancements:
-* [antimixedutf8](https://www.unrealircd.org/docs/Set_block#set::antimixedutf8)
-  has been improved to detect CJK and other scripts and this will now
-  catch more mixed UTF8 spam. Note that, if you previously manually
-  set the score very tight (much lower than the default of 10) then you
-  may have to increase it a bit, or not, depending on your network.
-* Support for IRCv3 [+typing clienttag](https://ircv3.net/specs/client-tags/typing.html),
-  which adds "user is typing" support to channels and PM (if the client
-  supports it).
-* New flood countermeasure,
-  [set::anti-flood::target-flood](https://www.unrealircd.org/docs/Set_block#set%3A%3Aanti-flood%3A%3Atarget-flood),
-  which limits flooding to channels and users. This is only meant as a
-  filter for high rate floods. You are still encouraged to use
-  [channel mode +f](https://www.unrealircd.org/docs/Anti-flood_features#Channel_mode_f)
-  in channels which give you more customized and fine-grained options
-  to deal with low- and medium-rate floods.
-* If a chanop /INVITEs someone, it will now override ban forwards
-  such as ```+b ~f:#forward:*!*@*```.
-
-Changes:
-* We now do parallel builds by default (```make -j4```) within ./Config,
-  unless the ```$MAKE``` or ```$MAKEFLAGS``` environment variable is set.
-* [set::restrict-commands](https://www.unrealircd.org/docs/Set_block#set%3A%3Arestrict-commands):
-  * The ```disable``` option is now removed as it is implied. In other words: if
-    you want to disable a command, then simply don't use ```connect-delay```.
-  * You can now have a block without ```connect-delay``` but still make
-    users bypass the restriction with ```exempt-identified``` and/or
-    ```exempt-reputation-score```. Previously this was not possible.
-* We now give an error when an IRCOp tries to place an *LINE that already
-  exists. (Previously we sometimes replaced the existing *LINE and other
-  times we did not)
-* Add Polish HELPOP (help.pl.conf)
-
-Module coders / Developers:
-* Breaking API change in ```HOOKTYPE_CAN_SEND_TO_USER``` and
-  ```HOOKTYPE_CAN_SEND_TO_CHANNEL```: the final argument has changed
-  from ```int notice``` to ```SendType sendtype```, which is an
-  enum, since we now have 3 message options (PRIVMSG, NOTICE, TAGMSG).
-
-UnrealIRCd 5.0.4
-------------------
-
-This new 5.0.4 version fixes quite a number of bugs. It contains only two small feature improvements.
-
-Fixes:
-* When placing a SHUN on an online user it was not always effective.
-* Channeldb was not properly restoring all channel modes, such as +P.
-* When upgrading UnrealIRCd it could sometimes crash the currently
-  running IRC server (rare), or trigger a crash report on
-  ```./unrealircd restart``` (quite common).
-* UnrealIRCd was giving up too easily on ident lookups.
-* Crash when unloading a module with moddata.
-* Crash if an authenticated server sends wrong information (rare).
-* Removing a TEMPSHUN did not work if the user was on another server.
-* SAJOIN to 0 (part all channels) resulted in a desync when used on remote users.
-* Forced nick change from services was not showing up if the user
-  was not in any channels.
-
-Enhancements:
-* New option [set::hide-idle-time::policy](https://www.unrealircd.org/docs/Set_block#set%3A%3Ahide-idle-time)
-  by which you can change usermode +I (hide idle time in WHOIS) from
-  oper-only to settable by users. More options will follow in a future
-  release.
-* In WHOIS you can now see if a user is currently (temp)shunned.
-  This only works for locally connected users for technical reasons,
-  so use ```/WHOIS Nick Nick``` to see it for remote users.
-
-Changes:
-* The oper notices and logging with regards to server linking have changed
-  a little. They are more consistent and log more now.
-* When an IRCOp tries to oper up from an insecure connection we will now
-  mention the https://www.unrealircd.org/docs/FAQ#oper-requires-tls page.
-  This message is customizable through
-  [set::plaintext-policy::oper-message](https://www.unrealircd.org/docs/Set_block#set::plaintext-policy).
-* The French HELPOP text was updated.
-
-UnrealIRCd 5.0.3.1
--------------------
-This fixes a crash issue after REHASH in 5.0.3.
-
-UnrealIRCd 5.0.3
------------------
-Fixes:
-* Fix serious flood issue in labeled-response implementation.
-* An IRCOp SQUIT'ing a far remote server may cause a broken link topology
-* In channels that are +D (delayed join), PARTs were not shown correctly to
-  channel operators.
-
-Enhancements:
-* A new HISTORY command for history playback (```HISTORY #channel number-of-lines```)
-  which allows you to fetch more lines than the on-join history playback.
-  Of course, taking into account the set limits in the +H channel mode.
-  This command is one of the [two interfaces](https://www.unrealircd.org/docs/Channel_history#Ways_to_retrieve_history)
-  to [Channel history](https://www.unrealircd.org/docs/Channel_history).
-* Two new [message tags](https://www.unrealircd.org/docs/Message_tags),
-  ```unrealircd.org/userip``` and ```unrealircd.org/userhost```
-  which communicate the user@ip and real user@host to IRCOps.
-
-Changes:
-* Drop the draft/ prefix now that the IRCv3
-  [labeled-response](https://ircv3.net/specs/extensions/labeled-response.html)
-  specification is out of draft.
-* The operclass permission ```immune:target-limit``` is now called
-  ```immune:max-concurrent-conversations```, since it bypasses
-  [set::anti-flood::max-concurrent-conversations](https://www.unrealircd.org/docs/Set_block#set::anti-flood::max-concurrent-conversations).
-  For 99% of the users this change is not important, but it may be
-  if you use highly customized [operclass blocks](https://www.unrealircd.org/docs/Operclass_block)
-
-Are you upgrading from UnrealIRCd 4.x to UnrealIRCd 5? If so,
-then check out the *UnrealIRCd 5* release notes [further down](#unrealircd-5). At the
-very least, check out [Upgrading from 4.x](https://www.unrealircd.org/docs/Upgrading_from_4.x).
-
-UnrealIRCd 5.0.2
------------------
-
-Fixes:
-* Halfop users are not synced correctly, resulting in missing users across links.
-* [Channel history](https://www.unrealircd.org/docs/Channel_history) used
-incorrect time internally, resulting in messages expiring too soon.
-The syntax is now really ```/MODE #chan +H lines:time-in-minutes```.
-To make clear that the time is in minutes, an 'm' will be added
-automatically by the server (eg ```+H 15:1440m```).
-* Documentation: to exempt someone from gline via /ELINE you have to use type 'G', not 'g'.
-  Similarly, to exempt from spamfilter, use type 'F' and not 'f'.
-* Exempting IPs from throttling via [except throttle](https://www.unrealircd.org/docs/Except_throttle_block) was not working.
-* Unable to customize [set::tls::outdated-protocols](https://www.unrealircd.org/docs/Set_block#set::ssl::outdated-protocols)
-  and [set::tls::outdated-ciphers](https://www.unrealircd.org/docs/Set_block#set::ssl::outdated-ciphers).
-* Specifying multiple channels did not work in [set::auto-join](https://www.unrealircd.org/docs/Set_block#set::auto-join),
-  [set::oper-auto-join](https://www.unrealircd.org/docs/Set_block#set::oper-auto-join) and
-  [tld::channel](https://www.unrealircd.org/docs/Tld_block).
-
-Enhancements:
-* [Extended server bans](https://www.unrealircd.org/docs/Extended_server_bans) in *LINE and /ELINE allow
-  you to ban or exempt users on criteria other than host/IP. These use a
-  similar syntax to extended bans. Currently supported are ~a, ~S and ~r. Examples:
-  * ```/ELINE ~a:TrustedAccount kG 0 This user can bypass kline/gline when using SASL```
-  * ```/ELINE ~S:1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef kGF 0 Trusted user with this certificate fingerprint```
-  * ```/GLINE ~r:*some*stupid*real*name*```
-  * These can also be used in the configuration file, eg: ```except ban { mask ~S:11223344etc; type all; };```
-* New options that may not be used much, but can be useful on specific networks:
-  * The IRCd may add automatic bans, for example due to a blacklist hit,
-    a spamfilter hit, or because of antirandom or antimixedutf8. The new
-    option [set::automatic-ban-target](https://www.unrealircd.org/docs/Set_block#set::automatic-ban-target) specifies on *what* the ban should
-    be placed. The default is *ip*. Other options are: userip, host, userhost, account, certfp.
-  * Similarly, an oper may type ```/GLINE nickname```. The new option
-    [set::manual-ban-target](https://www.unrealircd.org/docs/Set_block#set::manual-ban-target) specifies on what the ban should be placed.
-    By default this is *host* (fallback to *ip*).
-* New options to exempt webirc users: [set::connthrottle::webirc-bypass](https://www.unrealircd.org/docs/Connthrottle),
-  [set::restrict-commands::name-of-command::exempt-webirc](https://www.unrealircd.org/docs/Set_block#set::restrict-commands).
-
-UnrealIRCd 5.0.1
------------------
-
-Fixes:
-* IRCd may hang in rare circumstances
-* Windows: fix repeated "ERROR renaming 'data/reputation.db.tmp'" warnings
-* Antirandom and blacklist did not deal properly with 'warn' actions
-* [Authprompt](https://www.unrealircd.org/docs/Authentication#How_it_looks_like)
-  did not always work properly
-* Line numbers were incorrect in config file warnings/errors when using @if or @define
-
-Enhancements:
-* New /ELINE exception type 'm' to bypass allow::maxperip.
-  Or in the configuration file: ```except ban { mask 203.0.113.0/24; type maxperip; };```
-* IRCOps can override MLOCK restrictions when services are down,
-  if they have the channel:override:mlock operclass permission,
-  such as opers which use the operclass 'netadmin-with-override'.
-
-Other:
-* Gottem and k4be have [uploaded their 3rd party modules](https://modules.unrealircd.org/)
-  to unrealircd-contrib so *NIX users can now easily install them using the new
-  [Module manager](https://www.unrealircd.org/docs/Module_manager)
-
-UnrealIRCd 5
--------------
-After more than 6 months of hard work, UnrealIRCd 5 is now our new "stable" branch.
-In particular I would like to thank Gottem and 'i' for their source code
-contributions and PeGaSuS and westor for testing releases.
-
-When we transitioned from 3.2.x to 4.0.0 there were 175,000 lines of source code
-added/removed during 3 years of development. This time it was 120,000 lines in
-only 6 months, a major effort!
-
-**If you are upgrading from 4.x to 5.x, then it would be wise to read
-[Upgrading from 4.x](https://www.unrealircd.org/docs/Upgrading_from_4.x).
-In any case, be sure to upgrade your services package first! (if you use any)**
-
-UnrealIRCd 5 is compatible with the following services:
-* [anope](https://www.anope.org/) (version 2.0.7 or higher) -
-  with the "unreal4" protocol module
-* [atheme](https://atheme.github.io/atheme.html) (version 7.2.9 or higher) -
-  with the "unreal4" protocol module
+Many thanks to k4be for his help during development, other contributors for
+their feedback and patches, the people who tested the beta's and release
+candidates, translators and everyone else who made this release happen!
 
 Summary
 --------
-The most visible change to end-users is channel history. A lot of IRCv3 features were added.
-Various modules from Gottem have been integrated and enhanced.
-We now have a 3rd party module manager so you can install modules with 1 simple command.
-Channel settings of ```+P``` channels and *LINES are saved in a database and
-restored on startup (via 'channeldb' and 'tkldb' respectively).
-Channel mode ```+L``` has a slight change of meaning, the existing floodprot
-mode (```+f```) has a new type to prevent repeated messages and a new drop action.
-A few extended bans have been added as well (```~f``` and ```~p```).
-IRCOps now have the ability to add ban exceptions via the ```/ELINE``` command.
-Advanced admins can use more dynamic configuration options where you can
-define variables and use them later in the configuration file.
-Finally, there have been speed improvements, we use better defaults and
-have added more countermeasures and options against spambots.
-Under the hood *a significant amount* of the source code was changed and cleaned up.
-
-Read below for the full list of enhancements, changes and removals (and information for developers too).
+UnrealIRCd 6 comes with a completely redone logging system (with optional
+JSON support), named extended bans, four new IRCv3 features,
+geoip support and remote includes support built-in.
+
+Additionally, things are more customizable such as what gets sent to
+which snomask. All the +vhoaq channel modes are now modular as well,
+handy for admins who don't want or need halfops or +q/+a.
+For WHOIS it is now customizable in detail who gets to see what.
+
+A summary of the features is available at
+[What's new in UnrealIRCd 6](https://www.unrealircd.org/docs/What's_new_in_UnrealIRCd_6).
+For complete information, continue reading the release notes below.
+The sections below contain all the details.
+
+Upgrading from UnrealIRCd 5
+----------------------------
+The previous stable series, UnrealIRCd 5, will no longer get any new features.
+We still do bug fixes until July 1, 2022. In the 12 months after that, only
+security issues will be fixed. Finally, after July 1, 2023,
+[all support will stop](https://www.unrealircd.org/docs/UnrealIRCd_5_EOL).
+
+If you want to hold off for a while because you are cautious or if you
+depend on 3rd party modules (which may not have been upgraded yet by their
+authors) then feel free to wait a while.
+
+If you are upgrading from UnrealIRCd 5 to 6 then you can use your existing
+configuration and files. There's no need to start from scratch.
+However, you will need to make a few updates, see
+[Upgrading from 5.x to 6.x](https://www.unrealircd.org/docs/Upgrading_from_5.x).
 
 Enhancements
 -------------
-* Support for IRCv3 server generated [message tags](https://ircv3.net/specs/extensions/message-tags), which allows us to communicate
-  additional information in protocol messages such as in JOIN and PRIVMSG.
-  Currently implemented and permitted message tags are:
-  * [account](https://ircv3.net/specs/extensions/account-tag-3.2): communicate the services account that a user uses
-  * [msgid](https://ircv3.net/specs/extensions/message-ids): assign an unique message id to each message
-  * [time](https://ircv3.net/specs/extensions/server-time-3.2): assign a time label to each message
-  The last two are mainly for history playback.
-* Support for IRCv3 [echo-message](https://ircv3.net/specs/extensions/echo-message-3.2), which helps clients, among other things,
-  to see if the message you sent was altered in any way, eg: censored,
-  stripped from color, etc.
-* Support for IRCv3 [draft/labeled-response-0.2](https://ircv3.net/specs/extensions/labeled-response), which helps clients to
-  correlate commands and responses.
-* Support for IRCv3 [BATCH](https://ircv3.net/specs/extensions/batch-3.2), needed for some other features.
-* Recording and playback of [channel history](https://www.unrealircd.org/docs/Channel_history) when channel mode +H is set.
-  The syntax is: ```MODE #chan +H max-lines-to-record:max-time-to-record-in-minutes```.
-
-  For example: ```MODE #chan +H 50:1440``` means the last 50 messages will be stored and no
-  message will be stored longer than 1440 minutes (1 day).
-
-  The channel history is then played back when joining such a channel,
-  but with two things to keep in mind:
-  1) The client must support the 'server-time' CAP ('time' message tag),
-     otherwise history is not shown. Any modern IRC client supports this.
-  2) Only a maximum of 15 lines are played back on-join by default
-
-  The reason for the maximum 15 lines on-join playback is that this can
-  be quite annoying if you rejoin repeatedly and as to not flood the users
-  screen too much (unwanted). In the future we will support a mechanism
-  for clients to "fetch" history - rather than sending it on-join - so
-  they can fetch more than the 15 lines, up to the number of lines and
-  time configured in the +H channel mode.
-
-  You can configure the exact number of lines that are played back and
-  all the limits that apply to +H via [set::history::channel](https://www.unrealircd.org/docs/Set_block#set::history).
-* For saving and retrieving history we currently have the following options:
-  * *history_backend_mem*: channel history is stored in memory.
-    This is very fast but also means history is lost on restart.
-  * *history_backend_null*: don't store channel history at all.
-    This can be useful to load on servers with no users on it, such as a
-    hub server, where storing history is unnecessary.
-
-  As you can see there is currently no 'disk' backend. However, in the
-  future more options may be added. Also note that 3rd party modules
-  can add history backends as well.
-* Support for ban exceptions via the new ```/ELINE``` command. This allows you
-  to add exceptions for regular bans (KLINE/GLINE/ZLINE/etc), but also
-  for connection throttling and blacklist checking.
-  For more information, just type ```/ELINE ``` in your IRC client as an IRCOp.
-* [Websocket](https://www.unrealircd.org/docs/WebSocket_support) support now includes type 'text'
-  in addition to 'binary', which should work with [KiwiIRC](https://kiwiirc.com/)'s nextclient.
-
-  Also, websockets are no longer active on all ports by default. You have to explicitly
-  enable the websocket option in the listen block and also specify type *text* or *binary*,
-  eg: ```listen { ip *; port 6667; options { websocket { type text; } } }```
-
-  Also note that websockets require nick names and channels to consist of UTF8
-  characters only, due to
-  [WebSocket being incompatible with non-UTF8](https://www.unrealircd.org/docs/WebSocket_support#Problems_with_websockets_and_non-UTF8)
-* There's now a [Module manager](https://www.unrealircd.org/docs/Module_manager)
-  which allows you to install and upgrade 3rd party modules in an easy way:
-  * ```./unrealircd module list``` - to list all available 3rd party modules
-  * ```./unrealircd module install third/something``` - to install the specified module.
-* You can now test for configuration errors without actually starting the
-  IRC server. This is ideal if you are upgrading UnrealIRCd to a newer
-  version: simply run ```./unrealircd configtest``` to make sure it passes
-  the configuration test, and then you can safely restart the server for
-  the upgrade (in this example case).
-* Channel mode +L now kicks in for any rejected join, so not just for +l but
-  also for +b, +i, +O, +z, +R and +k. If, for example, the channel is
-  +L #insecure and also +z then, when an insecure user ties to join, they
-  will be redirected to #insecure.
-* New extended ban ~f to forward users to the specified channel if the ban
-  matches. Example: ```MODE #chan +b ~f:#badisp:*!*@*.isp.org```
-* Channel mode +f now has a 'd' action: drop message. This will send an
-  error message to the user and not show the message in the channel but
-  otherwise do nothing (no kick or ban).
-  For example: ```MODE #chan +f [5t#d]:15``` will limit sending a maximum of
-  5 messages per 15 seconds per-user and drop any messages sent above that limit.
-* Channel mode +f now has 'r' floodtype to prevent repeated lines. This will
-  compare the current message to the last message and the one before that
-  the user sent to the channel. If it's a repeat then the user can be
-  kicked (the default action), the message can be dropped ('d') or the
-  user can be banned ('b'). Example: ```MODE #chan +f [1r#d]:15```
-  If you want to permit 1 repeated line but not 2 then use: ```+f [2r#d]:15```
-* New module **tkldb** (loaded by default): all *LINES and spamfilters are now
-  saved across reboots. No need for services for that anymore.
-* New module **channeldb** (loaded by default): saves and restores all channel
-  settings including topic, modes, bans etc. of +P (persistent) channels.
-* New module [restrict-commands](https://www.unrealircd.org/docs/Set_block#set::restrict-commands), which allows you to restrict any IRC
-  command based on criteria such as "how long is this user connected",
-  "is this user registered (has a services account)" etc.
-  The example.conf now ships with configuration to disable LIST the
-  first 60 seconds and disable INVITE the first 120 seconds.
-  If you are having spambot problems then tweaking this configuration
-  may be helpful to you.
-* New option [set::require-module](https://www.unrealircd.org/docs/Set_block#set::require-module), which allows you to require certain
-  modules on other UnrealIRCd 5 servers, otherwise the link is rejected.
-* New option [set::min-nick-length](https://www.unrealircd.org/docs/Set_block#set::min-nick-length) to set a minimum nick length.
-* New module rmtkl (loaded by default): this allows you to remove TKL's
-  such as GLINEs easily via the /RMTKL command.
-* The [reputation and connthrottle](https://www.unrealircd.org/docs/Connthrottle) modules are now loaded by default.
-  Just as a reminder, what these do is classifying your users in "known
-  users (known IP's)" and "unknown IP's" for IP's that have not been
-  seen before (or only for a short amount of time). Then, when there
-  is a connection flood, unknown/new IP addresses are throttled at
-  20 connections per minute, while known users are always allowed in.
-* Add support for [defines and conditional configuration](https://www.unrealircd.org/docs/Defines_and_conditional_config) via @define and @if.
-  This is mostly for power users, in particular users who share the same
-  configuration file across several servers.
-* New extban ~p to hide the part/quit message in PART and QUIT.
-  For example: ```MODE #chan +b ~p:*!*@*.nl```
-* You will now see a warning when a server is not responding even
-  before they time out. How long to wait for a PONG reply upon PING
-  can be changed via [set::ping-warning](https://www.unrealircd.org/docs/Set_block#set::ping-warning) and defaults to 15 seconds.
-  If you see the warning frequently then your connection is flakey.
-* Add new setting [set::broadcast-channel-messages](https://www.unrealircd.org/docs/Set_block#set::broadcast-channel-messages) which defines when
-  channel messages are sent across server links. The default setting
-  is *auto* which is the correct setting for pretty much everyone.
-* Add new option [set::part-instead-of-quit-on-comment-change](https://www.unrealircd.org/docs/Set_block#set::part-instead-of-quit-on-comment-change):
-  when a QUIT message is changed due to channel restrictions, such as
-  stripping color or censoring a word, we normally change the QUIT
-  message. This has an effect on ALL channels, not just the one that
-  imposed the restrictions. While we feel that is the best tradeoff,
-  there is now also this new option (off by default) that will change
-  the QUIT into a PART in such a case, so the other channels that
-  do not have the restrictions (eg: are -S and -G) can still see the
-  original QUIT message.
-* New module [webredir](https://www.unrealircd.org/docs/Set_block#set::webredir::url). Quite some people run their IRCd on port 443 or 80
-  so their users can avoid firewall restrictions in place. In such a case,
-  with this module, you can now send a HTTP redirect in case some user
-  enters your IRC server name in their browser. Eg https://irc.example.org/
-  can be made to redirect to https://www.example.org/
-* We now protect against misbehaving SASL servers and will time out
-  SASL sessions after
-  [set::sasl-timeout](https://www.unrealircd.org/docs/Set_block#set::sasl-timeout),
-  which is 15 seconds by default.
-
-Changed
+* Completely new log system and snomasks overhaul
+  * Both logging and snomask sending is done by a single logging function
+  * Support for [JSON logging](https://www.unrealircd.org/docs/JSON_logging)
+    to disk, instead of the default text format.
+    JSON logging adds lot of detail to log messages and consistently
+    expands things like *client* with properties like *hostname*,
+    *connected_since*, *reputation*, *modes*, etc.
+  * The JSON data is also sent to all IRCOps who request the
+    `unrealircd.org/json-log` capability. The data is then sent in
+    a message-tag called `unrealircd.org/json-log`. This makes it ideal
+    for client scripts and bots to do automated things.
+  * A new style log { } block is used to map what log messages should be
+    logged to disk, and which ones should be sent to snomasks.
+  * The default logging to snomask configuration is in `snomasks.default.conf`
+    which everyone should include from unrealircd.conf. That is, unless you
+    wish to completely reconfigure which logging goes to which snomasks
+    yourself, which is also an option now.
+  * See [Snomasks](https://www.unrealircd.org/docs/Snomasks#UnrealIRCd_6)
+    on the new snomasks - lots of letters changed!
+  * See [FAQ: Converting log { } block](https://www.unrealircd.org/docs/FAQ#old-log-block)
+    on how to change your existing log { } blocks for disk logging.
+  * We now have a consistent log format and log messages can be multiline.
+  * Colors are enabled by default in snomask server notices, these can be disabled via
+    [set::server-notice-colors](https://www.unrealircd.org/docs/Set_block#set::server-notice-colors)
+    and also in [oper::server-notice-colors](https://www.unrealircd.org/docs/Oper_block)
+* Almost all channel modes are modularized
+  * Only the three list modes (+b/+e/+I) are still in the core
+  * The five [level modes](https://www.unrealircd.org/docs/Channel_Modes#Access_levels)
+    (+vhoaq) are now also modular. They are all loaded by default but you can
+    blacklist one or more if you don't want them. For example to disable halfop:
+    `blacklist-module chanmodes/halfop;`
+  * Support for compiling without PREFIX_AQ has been removed because
+    people often confused it with disabling +a/+q which is something
+    different.
+* Named extended bans
+  * Extbans now no longer show up with single letters but with names.
+    For example `+b ~c:#channel` is now `+b ~channel:#channel`.
+  * Extbans are automatically converted from the old to the new style,
+    both from clients and from/to older UnrealIRCd 5 servers.
+    The auto-conversion also works fine with complex extbans such as
+    `+b ~t:5:~q:nick!user@host` to `+b ~time:5:~quiet:nick!user@host`.
+* New IRCv3 features:
+  * [MONITOR](https://ircv3.net/specs/extensions/monitor.html): an
+    alternative for `WATCH` to monitor other users ("notify list").
+  * draft/extended-monitor: extensions for MONITOR, still in draft.
+  * [invite-notify](https://ircv3.net/specs/extensions/invite-notify):
+    report channel invites to other chanops (or users) in a machine
+    readable way.
+  * [setname](https://ircv3.net/specs/extensions/setname.html):
+    notify clients about realname (gecos) changes.
+* GeoIP lookups are now done by default
+  * This shows the country of the user to IRCOps in `WHOIS` and in the
+    "user connecting" line.
+  * By default the `geoip_classic` module is loaded, for which we
+    provide a mirror of database updates at unrealircd.org. This uses
+    the classic geolite library that is now shipped with UnrealIRCd
+  * Other options are the `geoip_maxmind` and `geoip_csv` modules.
+* Configure `WHOIS` output in a very precise way
+  * You can now decide which fields (eg modes, geo, certfp, etc) you want
+    to expose to who (everyone, self, oper).
+  * See [set::whois-details](https://www.unrealircd.org/docs/Set_block#set::whois-details)
+    for more details.
+* We now ship with 3 cloaking modules and you need to load 1 explicitly
+  via `loadmodule`:
+  * `cloak_sha256`: the recommended module for anyone starting a *new*
+    network. It uses the SHA256 algorithm under the hood.
+  * `cloak_md5`: for anyone who is upgrading their network from older
+    UnrealIRCd versions. Use this so your cloaked host bans remain the same.
+  * `cloak_none`: if you don't want any cloaking, not even as an option
+    to your users (rare)
+* Remote includes are now supported everywhere in the config file.
+  * Support for `https://` fetching is now always available, even
+    if you don't compile with libcurl support.
+  * Anywhere an URL is encountered on its own, it will be fetched
+    automatically. This makes it work not only for includes and motd
+    (which was already supported) but also for any other file.
+  * To prevent something from being interpreted as a remote include
+    URL you can use 'value' instead of "value".
+* Invite notification: set `set::normal-user-invite-notification yes;` to make
+  chanops receive information about normal users inviting someone to their channel.
+  The name of this setting may change in a later version.
+* Websocket: you can add a `listen::options::websocket::forward 1.2.3.4` option
+  to make unrealircd accept a `Forwarded` (RFC 7239) header from a reverse proxy
+  connecting from `1.2.3.4` (plans to accept legacy `X-Forwarded-For` and a proxy
+  password too). This feature is currently experimental.
+
+Changes
 --------
-* Channel mode +L can now be set by chanops (+o and higher) instead of only
-  by +q (channel owner)
-* Channel names must now be valid UTF8 by default.
-  We actually have 3 possible settings of [set::allowed-channelchars](https://www.unrealircd.org/docs/Set_block#set::allowed-channelchars):
-  * **utf8**:  Channel must be valid UTF8, this is the new default
-  * **ascii**: A very strict setting, for example in use at freenode,
-     the channel name may not contain high ascii or UTF8
-  * **any**:   A very loose setting, which allows almost all characters
-     in the channel name. This was the OLD default, up to and
-     including UnrealIRCd 4. It is no longer recommended.
-
-  For most networks this new default setting of utf8 will be fine, since
-  by far most IRC clients use UTF8 for many years already.
-  If you have a network that has a significant portion of chatters
-  that are on old non-UTF8 clients that use a specific character set
-  then you may want to use ```set { allowed-nickchars any; }```
-  Some Russian and Ukrainian networks are known to need this.
-* The "except tkl" block is now called [except ban](https://www.unrealircd.org/docs/Except_ban_block#UnrealIRCd_5). If no type
-  is specified in an except ban { } block then we exempt the entry
-  from kline, gline, zline, gzline and shun.
-* We no longer use a blacklist for stats (set::oper-only-stats).
-  We use a whitelist now instead: [set::allow-user-starts](https://www.unrealircd.org/docs/Set_block#set::allow-user-stats).
-  Most users can just remove their old set::oper-only-stats line,
-  since the new default set::allow-user-starts setting is fine.
-* Windows: we now require a 64-bit version, Windows 7 or later.
-  The new program path is: C:\Program Files\UnrealIRCd 5
-  and the binaries have been moved to a new subdirectory: bin\
-* Modules lost their m_ prefix, so for example m_map is now just map.
-  Also the modules in cap/ are now directly in modules.
-* More modules that were previously PERM (permanent) can now be unloaded
-  and reloaded on the fly. This allows more "hotfixing" without restart
-  in case of a bug and also more control for admins at runtime.
-  Only <5 modules out of 173 are permanent now.
-* User mode +T now blocks channel CTCPs as well.
-* User mode +q (unkickable) could previously be set by any IRCOp.
-  This has been changed to require the self:unkickablemode operclass
-  permission. This is included in the *-with-override operclasses
-  (eg: netadmin-with-operoverride).
-* [set::modes-on-join](https://www.unrealircd.org/docs/Set_block#set::modes-on-join) is now ```+nt``` by default.
-* The [authprompt](https://www.unrealircd.org/docs/Authentication#How_it_looks_like) module is now loaded by default. This means that if
-  you do a soft kline on someone (eg: ```KLINE %*@*.badisp```) then the user
-  has a chance to [authenticate](https://www.unrealircd.org/docs/Authentication#How_it_looks_like) to services, even without SASL, and
-  bypass the ban if (s)he is authenticated.
-* The WHOX module is now used by default. Previously it was optional.
-  WHOX enhances the "WHO" output, providing additional information to
-  IRC clients such as the services account that someone is using.
-  It is also more universal than standard WHO. Unfortunately this also
-  means the WHO syntax changed to something less logical.
-* At many places the term *SSL* has been changed to *SSL/TLS* or *TLS*.
-  Configuration items (eg: set::ssl to set::tls) have been renamed
-  as well and so have directories (eg: conf/ssl to conf/tls).
-  The old configuration names still work and currently does NOT raise
-  any warning. Also, when upgrading an existing installation on *NIX,
-  the conf/tls directory will be symlinked to conf/ssl as to not break
-  any Let's Encrypt certificate scripts.
-* It is now mandatory to have at least one open SSL/TLS port, otherwise
-  UnrealIRCd will refuse to boot. Previously this was a warning.
-* IRCOps now need to use SSL/TLS in order to oper up, as the
-  [set::plaintext-policy::oper](https://www.unrealircd.org/docs/Set_block#set::plaintext-policy) default setting is now 'deny'.
-  Similarly, [set::outdated-tls-policy::oper](https://www.unrealircd.org/docs/Set_block#set::outdated-tls-policy) is now also 'deny'.
-  You can change this, if you want, but it is not recommended.
-* [set::outdated-tls-policy::server](https://www.unrealircd.org/docs/Set_block#set::outdated-tls-policy) is now 'deny' as well, since all
-  servers should use reasonable SSL/TLS protocols and ciphers.
-* The default generated certificated has been changed from RSA 4096 bits
-  to Elliptic Curve Cryptography "384r1". This provides the same amount
-  of security but at higher speed. This only affects the default self-
-  signed certificate. You can still use RSA certificates just fine.
-* If you do use an RSA certificate, we now require it to be at least
-  2048 bits otherwise UnrealIRCd will refuse to boot.
-* When matching [allow { } blocks](https://www.unrealircd.org/docs/Allow_block), we now always continue with the next
-  block (if any) if the password did not match or no password was
-  specified. In other words, allow::options::nopasscont is now the
-  default and we behave as if there was a ::wrongpasscont too.
-* All snomasks are now oper-only. Previously some were not, which
-  was confusing and could lead to information leaks.
-  Also removed weird set::snomask-on-connect accordingly.
-* The IRCd now uses hash tables that are resilient against hash table
-  attacks. Also, the hash tables have increased in size to speed things
-  up when looking up nick names etc.
-* Server options in VERSION (eg: Fhin6OoEMR3) are no longer shown to
-  normal users. They don't mean much nowadays anyway.
-* ```./Config``` now asks fewer questions and configure runs faster since
-  many unnecessary checks have been removed (compatibility with very
-  old compilers / systems).
-* We now default to system libs (eg: ```--with-system-pcre2``` is assumed)
-* Spamfilter should catch some more spam evasion techniques.
-* All /DCCDENY and deny dcc { } parsing and checking is now moved to
-  the 'dccdeny' module.
-* Windows: If you choose to run UnrealIRCd as a service then it now
-  runs under the low-privilege NetworkService account rather than
-  the high-privilege LocalSystem account.
-
-Minor issues fixed
--------------------
-* Specifying a custom OpenSSL/LibreSSL path should work now
+* TLS cipher and some other information is now visible for remote
+  clients as well, also in `[secure: xyz]` connect line.
+* Error messages in remote includes use the url instead of a temporary file
+* Downgrading from UnrealIRCd 6 is only supported down to 5.2.0 (so not
+  lower like 5.0.x). If this is a problem then make a copy of your db files
+  (eg: reputation.db).
 
 Removed
 --------
-* Support for old server protocols has been removed.
-  This means UnrealIRCd 5.x cannot link to 3.2.x. It also means you need
-  to use reasonably new services. Generally, if your services can link to
-  4.x then they should be able to link to 5.x as well. More information
-  about this change and why it was done
-  [can be found here](https://www.unrealircd.org/docs/FAQ#old-server-protocol).
-* Connecting with a server password will no longer send that password
-  to NickServ. Use [SASL](https://www.unrealircd.org/docs/SASL) instead!
-* Extended ban ~R (registered nick): this was the old method to match
-  registered users. Everyone should use ~a (services account) instead.
-* The old TRE **posix** regex method has been removed because the TRE
-  library is no longer maintained for over a decade and contains many
-  bugs. (It was already deprecated in UnrealIRCd 4.2.3).
-  Use type **regex** instead, which uses the modern PCRE2 regex engine.
-* Timesync support has been removed. Use your OS time synchronization
-  instead. (Note that Timesync was already disabled by default in 2018)
-* Changing time offsets via ```TSCTL OFFSET``` and ```TSCTL SVSTIME``` are no longer
-  supported. Use your OS time synchronization (NTP!). Adjustments via
-  TSCTL are simply not accurate enough.
-* The *nopost* module was removed since it no longer serves any useful
-  purpose. UnrealIRCd already protects against these kind of attacks
-  via ping cookies ([set::ping-cookie](https://www.unrealircd.org/docs/Set_block#set::ping-cookie), enabled by default).
-
-Deprecated
------------
-* The set::official-channels block is now deprecated. This provided a
-  mechanism to pre-configure channels that would have 0 members and
-  would appear in /LIST with those settings, but once you joined all
-  those settings would be gone. Rather confusing.
-
-  Since UnrealIRCd 4.x we have permanent channels (+P) and since 5.x
-  we store these permanent channels in a database so all settings are
-  saved every few minutes and across restarts.
+* /REHASH -motd and -opermotd are gone, just use /REHASH
 
-  Since permanent channels (+P) are much better, the official-channels
-  support will be removed in a later version. There's no reason to
-  use official-channels anymore.
-
-Developers
------------
-* The module header is now as follows:
-
-      ModuleHeader MOD_HEADER
-        = {
-              "nameofmodule",
-              "5.0",
-              "Some description", 
-              "Name of Author",
-              "unrealircd-5",
-          };
-  There's a new author field, the version must start with a digit,
-  and also the name of the module must match the loadmodule name.
-  So for example third/funmod must also be named third/funmod.
-* The ```MOD_TEST```, ```MOD_INIT```, ```MOD_LOAD``` and ```MOD_UNLOAD``` functions no longer
-  take a name argument. So: ```MOD_INIT(mymod)``` is now ```MOD_INIT()```
-* We now use our own BuildBot infrastructure, so Travis-CI and AppVeyor
-  have been removed.
-* We now use a new test framework.
-* ```Auth_Check()``` now returns ```1``` for allow and ```0``` on deny (!!)
-* New function ```new_message()``` which should be called when a new message
-  is sent, or at least for all channel events. It adds (or inherits)
-  message tags like 'account', 'msgid', 'time', etc.
-* Many send functions now take an extra MessageTag *mtags parameter,
-  including but not limited to: sendto_one() and sendto_server().
-* Command functions (CMD_FUNC) have an extra ```MessageTag *mtags```,
-  on the other hand the ```cptr``` parameter has been removed.
-* Command functions no longer return ```int``` but are ```void```,
-  the same is true for  ```exit_client()```. ```FLUSH_BUFFER``` has been removed too.
-  All this is a consequence of removing this (limited) signaling
-  of client exits. From now on, if you call ```exit_client()``` it will free
-  a lot of the client data and exit the user (close socket, send [s]quit),
-  but it will **not free 'sptr' itself**, so you can simply check if some
-  upstream function killed the client by checking ```IsDead(sptr)```.
-  This is highly recommended after running ```do_cmd()``` or calling other
-  functions that could kill a client. In which case you should return
-  rather than continue doing anything with ```sptr```.
-  Ultimately, in the main loop, the client will be freed (normally in less than 1 second).
-* New single unified ```sendto_channel()``` and ```sendto_local_common_channels()```
-  functions that are used by all the channel commands.
-* Numerics should now be sent using ```sendnumeric()```. There's also
-  a format string version ```sendnumericfmt()``` in case you need it,
-  in which case you need to pass the numeric format string yourself.
-  In such a case, don't forget the colon character, like ":%s", where needed.
-* The parameters in several hooks have changed. Many now have an
-  extra ```MessageTag *mtags``` parameter. Sometimes there are other changes
-  as well, for example ```HOOKTYPE_CHANMSG``` now has 4 extra parameters.
-* You can call do_cmd() with NULL mtags. Usually this is the correct way.
-* If you used ```HOOKTYPE_PRE_USERMSG``` to block a message then you
-  should now use ```HOOKTYPE_CAN_SEND_TO_USER```. Similarly, the hook
-  ```HOOKTYPE_CAN_SEND``` which deals with channels is now called
-  ```HOOKTYPE_CAN_SEND_TO_CHANNEL```. Some other remarks:
-  * You CANNOT use HOOKTYPE_PRE_USERMSG anymore.
-  * The hooks require you to set an error message if you return HOOK_DENY.
-  * You should not send an error message yourself from these hooks.
-    In other words: do not use sendnumeric(). This is done by the
-    hook caller, based on the error message you return.
-  * Thanks to this, all rejecting of user messages now use generic
-    numeric 531 and all rejecting of channel messages use numeric 404.
-    See also under *Client protocol* later in this document.
-* If you use CommandOverrideAddEx() to specify a priority value (rare)
-  then be aware that in 5.0.1 we now use the 4.0.x behavior again to
-  match the same style of priorities in hooks: overrides with the
-  lowest priority are run first.
-* If you ever send a timestamp in a printf-like function, such as
-  in ```sendto_server()```, then be sure to use ```%lld``` and cast the timestamp
-  to *long long* so that it is compatible with both *NIX and Windows.
-  Example: ```sendnotice(sptr, "Timestamp is %lld", (long long)ts);```
-* ```EventAdd()``` changed the order of parameters and expects every_msec now
-  which specifies the time in milliseconds rather than seconds. This
-  allows for additional precision, or at least multiple calls per second.
-  The minimum allowed every_msec value is 100 at this time.
-  The prototype is now: ```EventAdd(Module *module, char *name,
-  vFP event, void *data, long every_msec, int count);```
-* New ```HOOKTYPE_IS_HANDSHAKE_FINISHED```. If a module returns ```0``` there, then
-  the ```register_user()``` function will not be called and the user will
-  not come online (yet). This is used by CAP and some other stuff.
-  Can be useful if your module needs to "hold" a user in the registration
-  phase.
-* The function ```is_module_loaded()``` now takes a relative path like
-  "usermodes/noctcp" because with just "ctcp" one could not see the
-  difference between usermodes/noctcp and chanmodes/noctcp.
-* ```CHFL_CHANPROT``` is now ```CHFL_CHANADMIN```, ```is_chanprot()``` is now ```is_chanadmin()```
-* All hash tables now use [SipHash](https://en.wikipedia.org/wiki/SipHash), which is a hash function that is
-  resilient against hash table attacks. If you, as a module dev, too
-  use any hash tables anywhere (note: this is quite rare), then you
-  are recommended to use our functions, see the functions siphash()
-  and siphash_nocase() in src/hash.c.
-* The random generator has been updated to use [ChaCha](https://en.wikipedia.org/wiki/Salsa20#ChaCha20_adoption) (more modern).
-* You can now save pointers and integers etc. across rehashes by using
-  ```LoadPersistentPointer()``` and ```SavePersistentPointer()```. For an example,
-  see ```src/modules/chanmodes/floodprot.c``` how this can be used.
-  Note that there can be no struct or type changes between rehashes.
-* New ModData types: ```MODDATA_LOCALVAR``` and ```MODDA_GLOBALVAR```. These are
-  settings or things that are locally or globally identified by the
-  variable name only and not attached to any user/channel.
-* Various files have been renamed. As previously mentioned, the m_
-  prefix was dropped in ```src/modules/m_*.c```. Similarly the s_ prefix
-  was dropped in ```src/s_*.c``` since it no longer had meaning. Also some
-  files have been deleted and integrated elsewhere or renamed to
-  have a name that better reflects their true meaning.
-  Related to this change is that all command functions are now called
-  ```cmd_name``` rather than ```m_name```.
-* ```HOOKTYPE_CHECK_INIT``` and ```HOOKTYPE_PRE_LOCAL_CONNECT```
-  have their return value changed. You should now return ```HOOK_*```, such
-  as ```HOOK_DENY``` or ```HOOK_CONTINUE```.
+Breaking changes
+-----------------
+See https://www.unrealircd.org/docs/Upgrading_from_5.x, but in short:
+
+You can use the unrealircd.conf from UnrealIRCd 5, but you need to make
+a few changes:
+* You need to add `include "snomasks.default.conf";`
+* You need to load a cloaking module explicitly. Assuming you already
+  have a network then add: `loadmodule "cloak_md5";`
+* The log block(s) need to be updated, use something like:
+  ```
+  log {
+          source {
+              !debug;
+              all;
+          }
+          destination {
+              file "ircd.log" { maxsize 100M; }
+          }
+  }
+  ```
+
+Module coders (API changes)
+----------------------------
+* Be sure to bump the version in the module header from `unrealircd-5` to `unrealircd-6`
+* We use a lot more `const char *` now (instead of `char *`). In particular `parv`
+  is const now and so are a lot of arguments to hooks. This will mean that in your
+  module you have to use more const too. The reason for this change is to indicate
+  that certain strings should not be touched, as doing so is dangerous or could
+  have had side-effects that were unpredictable.
+* Logging has been completely redone. Don't use `ircd_log()`, `sendto_snomask()`,
+  `sendto_ops()` and `sendto_realops()` anymore. Instead use `unreal_log()` which
+  handles both logging to disk and notifying IRCOps.
+* Various struct member names changed, in particular in `ConfigEntry` and `ConfigFile`,
+  but also `channel->chname` is `channel->name` now.
+* get_channel() is now make_channel() and creates if needed, otherwise use find_channel()
+* The Extended Ban API has been changed a lot. We use a `BanContext` struct now
+  that we pass around a lot. You also don't need to do `+3` magic anymore on the
+  string as it is handled in another layer. When registering the extended ban,
+  `.flag` is now `.letter`, and you also need to set a `.name` to a string due
+  to named extended bans. Have a look at the built-in extban modules to see
+  how to handle the changes.
+* ModData now has an option `MODDATA_SYNC_EARLY`. See under *Server protocol*.
+* If you want to lag someone up, don't touch `client->since`, but instead use:
+  `add_fake_lag(client, msec)`
+* Some client/user struct changes, with `client->user->account` (instead of svid)
+  and `client->uplink->name` being the most important ones.
+* Possibly more, but above is like 90%+ of the changes that you will encounter.
 
 Server protocol
 ----------------
-* UnrealIRCd 5 now assumes you support the following PROTOCTL options:
-  ```NOQUIT EAUTH SID NICKv2 SJOIN SJ3 NICKIP TKLEXT2```.
-  If you fail to use ```SID``` or ```EAUTH``` then you will receive an
-  error. For the other options, support is *assumed*, no warning or
-  error is shown when you lack support. These are options that most,
-  if not all, services support since UnrealIRCd 4.x so it shouldn't be
-  a problem. More information [here](https://www.unrealircd.org/docs/FAQ#old-server-protocol)
-* ```PROTOCTL MTAGS``` indicates that the server is capable of handling
-  message tags and that the server can cope with 4K lines. (Note that
-  the ordinary non-message-tag part is still limited to 512 bytes).
-* Pseudo ID support in SASL was removed. We now use real UID's.
-  This breaks services who rely on the old pseudo ID format.
+* When multiple related `SJOIN` messages are generated for the same channel
+  then we now only send the current channel modes (eg `+sntk key`) in the
+  first SJOIN and not in the other ones as they are unneeded for the
+  immediate followup SJOINs, they waste unnecessary bytes and CPU.
+  Such messages may be generated when syncing a channel that has dozens
+  of users and/or bans/exempts/invexes. Ideally this should not need any
+  changes in other software, since we already supported such messages in the
+  past and code for handling it exists way back to 3.2.x, but you better
+  check to be sure!
+* If you send `PROTOCTL NEXTBANS` then you will receive extended bans
+  with Named EXTended BANs instead of letters (eg: `+b ~account:xyz`),
+  otherwise you receive them with letters (eg: `+b ~a:xyz`).
+* Some ModData of users is (also) communicated in the `UID` message while
+  syncing using a message tag that only appears in server-to-server traffic,
+  `s2s-md/moddataname=value`. Thus, data such as operinfo, tls cipher,
+  geoip, certfp, sasl and webirc is communicated at the same time as when
+  a remote connection is added.
+  This makes it that a "connecting from" server notice can include all this
+  information and also so code can make an immediate decission on what to do
+  with the user in hooks. ModData modules need to set
+  `mreq.sync = MODDATA_SYNC_EARLY;` if they want this.
+  Servers of course need to enable `MTAGS` in PROTOCTL to see this.
+* The `SLOG` command is used to broadcast logging messages. This is done
+  for log::destination remote, as used in doc/conf/snomasks.default.conf,
+  for example for link errors, oper ups, flood messages, etc.
+  It also includes all JSON data in a message tag when `PROTOCTL MTAGS` is used.
+* Bounced modes are gone: these were MODEs that started with a `&` which
+  servers were to act on with reversed logic (add becoming remove and
+  vice versa) and never to send something back to that server.
+  In practice this was almost never used and complicated the code (way)
+  too much.
 
 Client protocol
 ----------------
-* Support for message tags and other IRCv3 features. See the IRCv3
-  specifications for more details.
-* When a message is blocked, for whatever reason, we now use a generic
-  numeric response: ```:server 531 yourname targetname :reason``` for the block
-  This replaces all the various NOTICEs, ```ERR_NOCTCP```, ```ERR_NONONREG```, etc.
-  with just one single numeric.
-  The only other numerics that you may still encounter when PM'ing are
-  ```ERR_NOSUCHNICK```, ```ERR_TOOMANYTARGETS``` and ```ERR_TARGETTOOFAST```, which are
-  generic errors to any command involving targets. And ```ERR_SERVICESDOWN```.
-  Note that channel messages already had a generic numeric for signaling
-  blocked messages for a very long time, ```ERR_CANNOTSENDTOCHAN```.
-* The 271 response to the SILENCE command is now:
-  ```:server 271 yournick listentry!*@*```
-  Previously the nick name appeared twice, which was a mistake.
-* The 470 numeric, which is sent on /JOIN #channel redirect to #redirect
-  now uses the following format:
-  ```:server 470 yournick #channel #redirect :[Link] Cannot join channel...etc..```
-* Clients are recommended to implement and enable the
-  [server-time](https://ircv3.net/specs/extensions/server-time-3.2)
-  extension by default. When enabled, channel history is played back
-  on-join (if any) when the channel has channel mode +H.
-  Otherwise your users will not see channel history.
+* Extended bans now have names instead of letters. If a client sends the
+  old format with letters (eg `+b ~a:XYZ`) then the server will
+  convert it to the new format with names (eg: `+b ~account:XYZ`)
+* Support for `MONITOR` and the other IRCv3 features (see *Enhancements*)
diff --git a/doc/conf/badwords.conf b/doc/conf/badwords.conf
@@ -1,27 +1,44 @@
-badword channel { word "bitch";     replace "wombat";         }
-badword channel { word "bro";       replace "bo";             }
-badword channel { word "(brother)"; replace "bredda";         }
-badword channel { word "car";       replace "taxi";           }
-badword channel { word "discord";   replace "dicsord";        }
-badword channel { word "efnet";     replace "efrael";         }
-badword channel { word "hate";      replace "04 hate "; }
-badword channel { word "hello";     replace "smello";         }
-badword channel { word "house";     replace "flat";           }
-badword channel { word "gaming";    replace "gaymen";         }
-badword channel { word "im";        replace "m";              }
-badword channel { word "i'm";       replace "m";              }
-badword channel { word "i am";      replace "m";              }
-badword channel { word "ima";       replace "m";              }
-badword channel { word "my";        replace "me";             }
-badword channel { word "(nigger)";  replace "angel";          }
-badword channel { word "np";        replace "mp";             }
-badword channel { word "on";        replace "pon";            }
-badword channel { word "same";      replace "salami";         }
-badword channel { word "(skyp)";    replace "skik";           }
-badword channel { word "(ss)";      replace "ÏŸÏŸ";             }
-badword channel { word "(troll)";   replace "papillion";      }
-badword channel { word "uber";      replace "HELLS ANGELS";   }
-badword channel { word "(year)";    replace "yonk";           }
+badword channel { word "apartment";  replace "flat";           }
+badword channel { word "banana";     replace "bogoya";         }
+badword channel { word "bitch";      replace "wombat";         }
+badword channel { word "bro";        replace "bo";             }
+badword channel { word "(brother)";  replace "bredda";         }
+badword channel { word "bruh";       replace "bredda";         }
+badword channel { word "car";        replace "taxi";           }
+badword channel { word "cool";       replace "safe";           }
+badword channel { word "drunk";      replace "buck";           }
+badword channel { word "dude";       replace "blud";           }
+badword channel { word "discord";    replace "dicksword";      }
+badword channel { word "elaborate";  replace "ebloggerate";    }
+badword channel { word "efnet";      replace "efrael";         }
+badword channel { word "fuckin";     replace "blood clot";     }
+badword channel { word "fucking";    replace "blood clot";     }
+badword channel { word "fuckn";      replace "blood clot";     }
+badword channel { word "hate";       replace "04 hate "; }
+badword channel { word "hello";      replace "smello";         }
+badword channel { word "high";       replace "HIE";            }
+badword channel { word "home";       replace "flat";           }
+badword channel { word "house";      replace "flat";           }
+badword channel { word "gaming";     replace "gaymen";         }
+badword channel { word "im";         replace "m";              }
+badword channel { word "i'm";        replace "m";              }
+badword channel { word "i am";       replace "m";              }
+badword channel { word "ima";        replace "m";              }
+badword channel { word "jfc";        replace "bloody hell";    }
+badword channel { word "my";         replace "me";             }
+badword channel { word "nice";       replace "safe";           }
+badword channel { word "(nigger)";   replace "angel";          }
+badword channel { word "np";         replace "mp";             }
+badword channel { word "on";         replace "pon";            }
+badword channel { word "same";       replace "salami";         }
+badword channel { word "shitfaced";  replace "buck";           }
+badword channel { word "shit faced"; replace "buck";           }
+badword channel { word "shoes";      replace "kicks";          }
+badword channel { word "(skyp)";     replace "skik";           }
+badword channel { word "(ss)";       replace "ÏŸÏŸ";             }
+badword channel { word "(troll)";    replace "papillion";      }
+badword channel { word "uber";       replace "HELLS ANGELS";   }
+badword channel { word "(year)";     replace "yonk";           }
 
 badword channel { word "sup";       replace "wah gwaan"; }
 badword channel { word "wussup";    replace "wah gwaan"; }
@@ -33,15 +50,18 @@ badword channel { word "what's up"; replace "wah gwaan"; }
 badword channel { word "wuddup";    replace "wah gwaan"; }
 
 badword channel { word "gal";     replace "bint";  }
+badword channel { word "gf";      replace "bint";  }
 badword channel { word "(girl)";  replace "bint";  }
 badword channel { word "lady";    replace "bint";  }
 badword channel { word "ladies";  replace "bints"; }
 badword channel { word "(woman)"; replace "bint";  }
+badword channel { word "wife";    replace "bint";  }
 badword channel { word "women";   replace "bints"; }
 
 badword channel { word "ganja";     replace "bobby brown"; }
 badword channel { word "marijuana"; replace "bobby brown"; }
 badword channel { word "pot";       replace "bobby brown"; }
+badword channel { word "reefer";    replace "bobby brown"; }
 badword channel { word "weed";      replace "bobby brown"; }
 
 badword channel { word "kek";   replace "%%"; }
diff --git a/doc/conf/except.conf b/doc/conf/except.conf
@@ -1,28 +1,34 @@
 # IRCCloud
-except ban { mask *@5.254.36.56/29;     }
-except ban { mask *@192.184.9.108/32;   }
-except ban { mask *@192.184.9.112/32;   }
-except ban { mask *@192.184.10.118/32;  }
-except ban { mask *@192.184.10.9/32;    }
-except ban { mask *@192.184.8.103/32;   }
-except ban { mask *@2001:67c:2f08::/48; }
-except ban { mask *@2a03:5180:f::/62;   }
-except ban { mask *@2a03:5180:f:4::/63; }
-except ban { mask *@2a03:5180:f:6::/64; }
+except ban { 
+	mask *@5.254.36.56/29;
+	mask *@192.184.9.108/32;
+	mask *@192.184.9.112/32;
+	mask *@192.184.10.118/32;
+	mask *@192.184.10.9/32;
+	mask *@192.184.8.103/32;
+	mask *@2001:67c:2f08::/48;
+	mask *@2a03:5180:f::/62;
+	mask *@2a03:5180:f:4::/63;
+	mask *@2a03:5180:f:6::/64;
+}
 
 # KiwiIRC
-except ban { mask *@107.161.19.53;  }
-except ban { mask *@107.161.19.109; }
-except ban { mask *@109.169.31.4;   }
-except ban { mask *@109.169.31.13;  } # KiwiIRC Verify Bot (out.kiwiirc.com)
+except ban { 
+	mask *@107.161.19.53;
+	mask *@107.161.19.109;
+	mask *@109.169.31.4;
+	mask *@109.169.31.13; # KiwiIRC Verify Bot (out.kiwiirc.com)
+}
 
 # Mibbit
-except ban { mask *@207.192.75.252;                 } # ircip1.mibbit.com
-except ban { mask *@64.62.228.82;                   } # ircip2.mibbit.com
-except ban { mask *@78.129.202.38;                  } # ircip3.mibbit.com
-except ban { mask *@109.169.29.95;                  } # ircip4.mibbit.com
-except ban { mask *@97.107.138.109;                 } # bot.search.mibbit.com
-except ban { mask *@2600:3c03::f03c:91ff:fe96:c1fa; } # bot.search.mibbit.com
+except ban {
+	mask *@207.192.75.252;                 # ircip1.mibbit.com
+	mask *@64.62.228.82;                   # ircip2.mibbit.com
+	mask *@78.129.202.38;                  # ircip3.mibbit.com
+	mask *@109.169.29.95;                  # ircip4.mibbit.com
+	mask *@97.107.138.109;                 # bot.search.mibbit.com
+	mask *@2600:3c03::f03c:91ff:fe96:c1fa; # bot.search.mibbit.com
+}
 
 # Netsplit
-except ban { mask *@85.25.10.40;  } # anaconda.netsplit.de
-\ No newline at end of file
+except ban { mask *@85.25.10.40; } # anaconda.netsplit.de
+\ No newline at end of file
diff --git a/doc/conf/modules.conf b/doc/conf/modules.conf
@@ -1,5 +1,5 @@
 // Cloaking (+x)
-loadmodule "cloak";
+loadmodule "cloak_sha256";
 
 // User Commands (Minimal)
 #loadmodule "admin";
@@ -63,6 +63,7 @@ loadmodule "kill";
 #loadmodule "locops";
 loadmodule "mkpasswd";
 loadmodule "oper";
+loadmodule "operinfo";
 #loadmodule "opermotd";
 loadmodule "sajoin";
 loadmodule "samode";
@@ -76,7 +77,6 @@ loadmodule "tkl";
 loadmodule "trace";
 loadmodule "tsctl";
 loadmodule "unsqline";
-#loadmodule "wallops";
 
 // Server-2-Server Commands
 loadmodule "eos";
@@ -86,9 +86,11 @@ loadmodule "netinfo";
 loadmodule "server";
 loadmodule "sinfo";
 loadmodule "sjoin";
+loadmodule "slog";
 loadmodule "sqline";
 loadmodule "swhois";
 loadmodule "umode2";
+loadmodule "unreal_server_compat";
 
 // Services Commands
 loadmodule "sendsno";
@@ -108,25 +110,39 @@ loadmodule "svssno";
 loadmodule "svswatch";
 
 // Channel Modes
-loadmodule "chanmodes/censor";       /* +G */
-loadmodule "chanmodes/delayjoin";    /* +D */
-loadmodule "chanmodes/floodprot";    /* +f */
-loadmodule "chanmodes/history";      /* +H */
-loadmodule "chanmodes/issecure";     /* +Z */
-loadmodule "chanmodes/link";         /* +L */
-loadmodule "chanmodes/nocolor";      /* +c */
-loadmodule "chanmodes/noctcp";       /* +C */
-loadmodule "chanmodes/noinvite";     /* +V */
-loadmodule "chanmodes/nokick";       /* +Q */
-loadmodule "chanmodes/noknock";      /* +K */
-loadmodule "chanmodes/nonickchange"; /* +N */
-loadmodule "chanmodes/nonotice";     /* +T */
-loadmodule "chanmodes/operonly";     /* +O */
-loadmodule "chanmodes/permanent";    /* +P */
-loadmodule "chanmodes/regonly";      /* +R */
-loadmodule "chanmodes/regonlyspeak"; /* +M */
-loadmodule "chanmodes/secureonly";   /* +z */
-loadmodule "chanmodes/stripcolor";   /* +S */
+loadmodule "chanmodes/chanowner";      /* +q */
+loadmodule "chanmodes/chanadmin";      /* +a */
+loadmodule "chanmodes/chanop";         /* +o */
+loadmodule "chanmodes/halfop";         /* +h */
+loadmodule "chanmodes/voice";          /* +v */
+loadmodule "chanmodes/censor";         /* +G */
+loadmodule "chanmodes/delayjoin";      /* +D */
+loadmodule "chanmodes/floodprot";      /* +f */
+loadmodule "chanmodes/history";        /* +H */
+loadmodule "chanmodes/inviteonly";     /* +i */
+loadmodule "chanmodes/isregistered";   /* +r */
+loadmodule "chanmodes/issecure";       /* +Z */
+loadmodule "chanmodes/key";            /* +k */
+loadmodule "chanmodes/limit";          /* +l */
+loadmodule "chanmodes/link";           /* +L */
+loadmodule "chanmodes/moderated";      /* +m */
+loadmodule "chanmodes/nocolor";        /* +c */
+loadmodule "chanmodes/noctcp";         /* +C */
+loadmodule "chanmodes/noexternalmsgs"; /* +n */
+loadmodule "chanmodes/noinvite";       /* +V */
+loadmodule "chanmodes/nokick";         /* +Q */
+loadmodule "chanmodes/noknock";        /* +K */
+loadmodule "chanmodes/nonickchange";   /* +N */
+loadmodule "chanmodes/nonotice";       /* +T */
+loadmodule "chanmodes/operonly";       /* +O */
+loadmodule "chanmodes/permanent";      /* +P */
+loadmodule "chanmodes/private";        /* +p */
+loadmodule "chanmodes/regonly";        /* +R */
+loadmodule "chanmodes/regonlyspeak";   /* +M */
+loadmodule "chanmodes/secret";         /* +s */
+loadmodule "chanmodes/secureonly";     /* +z */
+loadmodule "chanmodes/stripcolor";     /* +S */
+loadmodule "chanmodes/topiclimit";     /* +t */
 
 // User Modes
 loadmodule "usermodes/bot";           /* +B */
@@ -139,24 +155,23 @@ loadmodule "usermodes/regonlymsg";    /* +R */
 loadmodule "usermodes/secureonlymsg"; /* +Z */
 loadmodule "usermodes/servicebot";    /* +S */
 #loadmodule "usermodes/showwhois";    /* +W */
-
-// Snomasks
-#loadmodule "snomasks/dccreject"; /* +D */
+#loadmodule "usermodes/wallops";      /* +w */
 
 // Extended Bans
-loadmodule "extbans/account";       /* +b ~a */
-#loadmodule "extbans/certfp";       /* +b ~S */
-#loadmodule "extbans/inchannel";    /* +b ~c */
-loadmodule "extbans/join";          /* +b ~j */
-loadmodule "extbans/msgbypass";     /* +e ~m */
-#loadmodule "extbans/nickchange";   /* +b ~n */
-#loadmodule "extbans/operclass";    /* +b ~O */
-#loadmodule "extbans/partmsg";      /* +b ~p */
-loadmodule "extbans/quiet";         /* +b ~q */
-#loadmodule "extbans/realname";     /* +b ~r */
-#loadmodule "extbans/textban";      /* +b ~T */
-loadmodule "extbans/timedban";      /* +b ~t */
-loadmodule "extbans/securitygroup"; /* +b ~G */
+loadmodule "extbans/account";       /* +b ~account        */
+loadmodule "extbans/certfp";        /* +b ~certfp         */
+#loadmodule "extbans/country";      /* +b ~country        */
+loadmodule "extbans/inchannel";     /* +b ~channel        */
+loadmodule "extbans/join";          /* +b ~join           */
+loadmodule "extbans/msgbypass";     /* +e ~msgbypass      */
+#loadmodule "extbans/nickchange";   /* +b ~nickchange     */
+#loadmodule "extbans/operclass";    /* +b ~operclass      */
+#loadmodule "extbans/partmsg";      /* +b ~partmsg        */
+loadmodule "extbans/quiet";         /* +b ~quiet          */
+#loadmodule "extbans/realname";     /* +b ~realname       */
+loadmodule "extbans/textban";       /* +b ~text           */
+loadmodule "extbans/timedban";      /* +b ~time           */
+loadmodule "extbans/securitygroup"; /* +b ~security-group */
 
 // IRCv3 Extensions
 loadmodule "account-notify";
@@ -166,10 +181,12 @@ loadmodule "bot-tag";
 loadmodule "chathistory";
 loadmodule "clienttagdeny";
 loadmodule "echo-message";
+loadmodule "extended-monitor";
 loadmodule "labeled-response";
 loadmodule "link-security";
 loadmodule "message-ids";
 loadmodule "message-tags";
+loadmodule "monitor";
 loadmodule "plaintext-policy";
 loadmodule "reply-tag";
 loadmodule "server-time";
@@ -178,24 +195,29 @@ loadmodule "typing-indicator";
 
 // Other
 loadmodule "antimixedutf8";
-loadmodule "authprompt";
+#loadmodule "authprompt";
 loadmodule "blacklist";
 loadmodule "certfp";
 loadmodule "channeldb";
 loadmodule "charsys";
 loadmodule "connthrottle";
+#loadmodule "geoip_base";
+#loadmodule "geoip_classic";
 loadmodule "hideserver";
 loadmodule "history_backend_mem";
 #loadmodule "history_backend_null";
 loadmodule "ident_lookup";
 loadmodule "jointhrottle";
+loadmodule "json-log-tag";
 loadmodule "targetfloodprot";
 loadmodule "tkldb";
 loadmodule "tls_antidos";
+loadmodule "tls_cipher";
 loadmodule "userhost-tag";
 loadmodule "userip-tag";
 loadmodule "reputation";
 loadmodule "restrict-commands";
 loadmodule "rmtkl";
+loadmodule "watch-backend";
 #loadmodule "webirc";
 #loadmodule "websocket";
 \ No newline at end of file
diff --git a/doc/conf/snomasks.conf b/doc/conf/snomasks.conf
@@ -0,0 +1,228 @@
+/* Server bans snomask - 'b' */
+log {
+	source {
+		tkl.BAN_REALNAME;
+		tkl.TKL_ADD;
+		tkl.TKL_DEL;
+		tkl.TKL_ADD_TEMPSHUN;
+		tkl.TKL_DEL_TEMPSHUN;
+		tkl.TKL_EXPIRE;
+		tkl.RMTKL_COMMAND;
+	}
+	destination {
+		snomask b;
+	}
+}
+
+/* Blacklist snomask: 'B' */
+log {
+	source {
+		blacklist;
+	}
+	destination {
+		snomask B;
+	}
+}
+
+/* Local client connects snomask - 'c' */
+log {
+	source {
+		connect.LOCAL_CLIENT_CONNECT;
+		connect.LOCAL_CLIENT_DISCONNECT;
+	}
+	destination {
+		snomask c;
+	}
+}
+
+/* Remote client connects snomask - 'C' */
+log {
+	source {
+		connect.REMOTE_CLIENT_CONNECT;
+		connect.REMOTE_CLIENT_DISCONNECT;
+	}
+	destination {
+		snomask C;
+	}
+}
+
+/* DCC rejections snomask - 'd' */
+log {
+	source {
+		dcc;
+	}
+	destination {
+		snomask d;
+	}
+}
+
+/* Debug snomask (not recommended) - 'D' */
+log {
+	source {
+		debug;
+	}
+	destination {
+		snomask D;
+	}
+}
+
+/* Floods snomask - 'f' */
+log {
+	source {
+		flood;
+	}
+	destination {
+		snomask f;
+	}
+}
+
+/* Join, parts, kicks - 'j' */
+log {
+	source {
+		// TODO: these don't exist yet..
+		join.LOCAL_CLIENT_JOIN;
+		join.REMOTE_CLIENT_JOIN;
+		part.LOCAL_CLIENT_PART;
+		part.REMOTE_CLIENT_PART;
+		kick.LOCAL_CLIENT_KICK;
+		kick.REMOTE_CLIENT_KICK;
+	}
+	destination {
+		snomask j;
+	}
+}
+
+/* Kill snomask */
+log {
+	source {
+		kill;
+	}
+	destination {
+		snomask k;
+	}
+}
+
+/* Local nick changes snomask - 'n' */
+log {
+	source {
+		nick.LOCAL_NICK_CHANGE;
+	}
+	destination {
+		snomask n;
+	}
+}
+
+/* Remote nick changes snomask - 'N' */
+log {
+	source {
+		nick.REMOTE_NICK_CHANGE;
+	}
+	destination {
+		snomask N;
+	}
+}
+
+/* Deny nick (QLINE) rejections snomask - 'q' */
+log {
+	source {
+		nick.QLINE_NICK_LOCAL_ATTEMPT;
+		nick.QLINE_NICK_REMOTE;
+	}
+	destination {
+		snomask q;
+	}
+}
+
+/* Spamfilter hits snomask - 'S' */
+log {
+	source {
+		tkl.SPAMFILTER_MATCH;
+	}
+	destination {
+		snomask S;
+	}
+}
+
+/* IRCOp overriding in channels (OperOverride) - 'o' */
+log {
+	source {
+		operoverride;
+	}
+	destination {
+		snomask o;
+	}
+}
+
+/* IRCOp changing user properties or forcing users to do things - 'O' */
+log {
+	source {
+		chgcmds;
+		sacmds;
+	}
+	destination {
+		snomask O;
+	}
+}
+
+/* VHOST usage - 'v' */
+log {
+	source {
+		vhost;
+	}
+	destination {
+		snomask v;
+	}
+}
+
+/* Snomask s (server notices) - the "catch all" snomask for all other things */
+log {
+	source {
+		link;
+		oper;
+		!debug;
+		nomatch;
+	}
+	destination {
+		snomask s;
+	}
+}
+
+/* These log sources are sent to all servers (globally).
+ * These are generally two categories:
+ * 1) Things that affect the network as a whole, eg linking
+ * 2) Things that otherwise cannot be logged by a remote server
+ *    that may interest ircops. Eg: a spamfilter match,
+ *    since that would otherwise not be propagated.
+ */
+log {
+	source {
+		/* All link messages affect the network so
+		 * these should be global. Except for the
+		 * link connecting... and timeout while
+		 * connecting.. messages, which can be noisy.
+		 */
+		link;
+		!link.LINK_CONNECTING;
+		!link.LINK_CONNECT_TIMEOUT;
+		!link.SERVER_LINKED_REMOTE;
+		!link.SERVER_LINKED;
+		/* All oper up/downs */
+		oper;
+		/* Flood messages, important to keep an eye on, network-wide */
+		flood;
+		/* TEMPSHUN: these are otherwise missing for snomask 'b' */
+		tkl.TKL_ADD_TEMPSHUN;
+		tkl.TKL_DEL_TEMPSHUN;
+		/* Spamfilter matches: needed for snomask 'S' */
+		tkl.SPAMFILTER_MATCH;
+		/* Critical issue: */
+		tls.TLS_CERT_EXPIRING;
+		/* SAMODE: needed for snomask 'o' */
+		samode.SAMODE_COMMAND;
+		/* Never any debug messages */
+		!debug;
+	}
+	destination {
+		remote;
+	}
+}
diff --git a/doc/conf/tls/curl-ca-bundle.crt b/doc/conf/tls/curl-ca-bundle.crt
@@ -1,7 +1,7 @@
 ##
 ## Bundle of CA Root Certificates
 ##
-## Certificate data from Mozilla as of: Tue Jan 19 04:12:04 2021 GMT
+## Certificate data from Mozilla as of: Tue Oct 26 03:12:05 2021 GMT
 ##
 ## This is a bundle of X.509 certificates of public Certificate Authorities
 ## (CA). These were automatically extracted from Mozilla's root certificates
@@ -14,7 +14,7 @@
 ## Just configure this file as the SSLCACertificateFile.
 ##
 ## Conversion done with mk-ca-bundle.pl version 1.28.
-## SHA256: 3bdc63d1de27058fec943a999a2a8a01fcc6806a611b19221a7727d3d9bbbdfd
+## SHA256: bb36818a81feaa4cca61101e6d6276cd09e972efcb08112dfed846918ca41d7f
 ##
 
 
@@ -156,38 +156,6 @@ Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z
 12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
 -----END CERTIFICATE-----
 
-QuoVadis Root CA
-================
------BEGIN CERTIFICATE-----
-MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE
-ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
-eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz
-MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp
-cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD
-EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk
-J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL
-F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL
-YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen
-AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w
-PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y
-ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7
-MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj
-YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs
-ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
-Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW
-Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu
-BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw
-FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0
-aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6
-tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo
-fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul
-LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x
-gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi
-5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi
-5nrQNiOKSnQ2+Q==
------END CERTIFICATE-----
-
 QuoVadis Root CA 2
 ==================
 -----BEGIN CERTIFICATE-----
@@ -275,26 +243,6 @@ s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ
 FL39vmwLAw==
 -----END CERTIFICATE-----
 
-Sonera Class 2 Root CA
-======================
------BEGIN CERTIFICATE-----
-MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
-U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw
-NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
-IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3
-/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT
-dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG
-f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P
-tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH
-nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT
-XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt
-0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI
-cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph
-Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx
-EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH
-llpwrN9M
------END CERTIFICATE-----
-
 XRamp Global CA Root
 ====================
 -----BEGIN CERTIFICATE-----
@@ -433,26 +381,6 @@ mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
 vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
 -----END CERTIFICATE-----
 
-DST Root CA X3
-==============
------BEGIN CERTIFICATE-----
-MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK
-ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X
-DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1
-cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD
-ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT
-rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9
-UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy
-xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d
-utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T
-AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ
-MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug
-dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE
-GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw
-RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS
-fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
------END CERTIFICATE-----
-
 SwissSign Gold CA - G2
 ======================
 -----BEGIN CERTIFICATE-----
@@ -718,51 +646,6 @@ vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz
 TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
 -----END CERTIFICATE-----
 
-GeoTrust Primary Certification Authority - G2
-=============================================
------BEGIN CERTIFICATE-----
-MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC
-VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu
-Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD
-ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1
-OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
-MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl
-b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG
-BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc
-KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD
-VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+
-EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m
-ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2
-npaqBA+K
------END CERTIFICATE-----
-
-VeriSign Universal Root Certification Authority
-===============================================
------BEGIN CERTIFICATE-----
-MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE
-BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
-ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
-IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u
-IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV
-UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
-cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
-IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0
-aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj
-1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP
-MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72
-9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I
-AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR
-tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G
-CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O
-a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
-DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3
-Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx
-Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx
-P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P
-wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4
-mJO37M2CYfE45k+XmCpajQ==
------END CERTIFICATE-----
-
 NetLock Arany (Class Gold) Főtanúsítvány
 ========================================
 -----BEGIN CERTIFICATE-----
@@ -938,82 +821,6 @@ Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z
 WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
 -----END CERTIFICATE-----
 
-Chambers of Commerce Root - 2008
-================================
------BEGIN CERTIFICATE-----
-MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD
-MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
-bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
-QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy
-Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl
-ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF
-EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl
-cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
-AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA
-XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj
-h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/
-ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk
-NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g
-D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331
-lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ
-0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
-ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2
-EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI
-G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ
-BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh
-bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh
-bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC
-CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH
-AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1
-wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH
-3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU
-RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6
-M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1
-YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF
-9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK
-zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG
-nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
-OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ
------END CERTIFICATE-----
-
-Global Chambersign Root - 2008
-==============================
------BEGIN CERTIFICATE-----
-MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD
-MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
-bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
-QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx
-NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg
-Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ
-QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
-aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf
-VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf
-XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0
-ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB
-/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA
-TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M
-H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe
-Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF
-HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
-wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB
-AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT
-BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE
-BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm
-aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm
-aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp
-1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0
-dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG
-/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6
-ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s
-dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg
-9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH
-foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du
-qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr
-P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq
-c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
-09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
------END CERTIFICATE-----
-
 Go Daddy Root Certificate Authority - G2
 ========================================
 -----BEGIN CERTIFICATE-----
@@ -1315,27 +1122,6 @@ OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9
 vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
 -----END CERTIFICATE-----
 
-Trustis FPS Root CA
-===================
------BEGIN CERTIFICATE-----
-MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG
-EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290
-IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV
-BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ
-KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ
-RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk
-H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa
-cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt
-o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA
-AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd
-BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c
-GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC
-yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P
-8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV
-l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl
-iB6XzCGcKQENZetX2fNXlrtIzYE=
------END CERTIFICATE-----
-
 Buypass Class 2 Root CA
 =======================
 -----BEGIN CERTIFICATE-----
@@ -1980,36 +1766,6 @@ uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7
 yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3
 -----END CERTIFICATE-----
 
-Staat der Nederlanden Root CA - G3
-==================================
------BEGIN CERTIFICATE-----
-MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE
-CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
-Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC
-TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l
-ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y
-olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t
-x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy
-EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K
-Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur
-mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5
-1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp
-07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo
-FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE
-41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB
-AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu
-yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD
-U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq
-KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1
-v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA
-8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b
-8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r
-mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq
-1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI
-JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV
-tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk=
------END CERTIFICATE-----
-
 Staat der Nederlanden EV Root CA
 ================================
 -----BEGIN CERTIFICATE-----
@@ -3226,3 +2982,251 @@ qqFJu3FS8r/2/yehNq+4tneI3TqkbZs0kNwUXTC/t+sX5Ie3cdCh13cV1ELX8vMxmV2b3RZtP+oG
 I/hGoiLtk/bdmuYqh7GYVPEi92tF4+KOdh2ajcQGjTa3FPOdVGm3jjzVpG2Tgbet9r1ke8LJaDmg
 kpzNNIaRkPpkUZ3+/uul9XXeifdy
 -----END CERTIFICATE-----
+
+AC RAIZ FNMT-RCM SERVIDORES SEGUROS
+===================================
+-----BEGIN CERTIFICATE-----
+MIICbjCCAfOgAwIBAgIQYvYybOXE42hcG2LdnC6dlTAKBggqhkjOPQQDAzB4MQswCQYDVQQGEwJF
+UzERMA8GA1UECgwIRk5NVC1SQ00xDjAMBgNVBAsMBUNlcmVzMRgwFgYDVQRhDA9WQVRFUy1RMjgy
+NjAwNEoxLDAqBgNVBAMMI0FDIFJBSVogRk5NVC1SQ00gU0VSVklET1JFUyBTRUdVUk9TMB4XDTE4
+MTIyMDA5MzczM1oXDTQzMTIyMDA5MzczM1oweDELMAkGA1UEBhMCRVMxETAPBgNVBAoMCEZOTVQt
+UkNNMQ4wDAYDVQQLDAVDZXJlczEYMBYGA1UEYQwPVkFURVMtUTI4MjYwMDRKMSwwKgYDVQQDDCNB
+QyBSQUlaIEZOTVQtUkNNIFNFUlZJRE9SRVMgU0VHVVJPUzB2MBAGByqGSM49AgEGBSuBBAAiA2IA
+BPa6V1PIyqvfNkpSIeSX0oNnnvBlUdBeh8dHsVnyV0ebAAKTRBdp20LHsbI6GA60XYyzZl2hNPk2
+LEnb80b8s0RpRBNm/dfF/a82Tc4DTQdxz69qBdKiQ1oKUm8BA06Oi6NCMEAwDwYDVR0TAQH/BAUw
+AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFAG5L++/EYZg8k/QQW6rcx/n0m5JMAoGCCqG
+SM49BAMDA2kAMGYCMQCuSuMrQMN0EfKVrRYj3k4MGuZdpSRea0R7/DjiT8ucRRcRTBQnJlU5dUoD
+zBOQn5ICMQD6SmxgiHPz7riYYqnOK8LZiqZwMR2vsJRM60/G49HzYqc8/5MuB1xJAWdpEgJyv+c=
+-----END CERTIFICATE-----
+
+GlobalSign Root R46
+===================
+-----BEGIN CERTIFICATE-----
+MIIFWjCCA0KgAwIBAgISEdK7udcjGJ5AXwqdLdDfJWfRMA0GCSqGSIb3DQEBDAUAMEYxCzAJBgNV
+BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJv
+b3QgUjQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAX
+BgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBSNDYwggIi
+MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCsrHQy6LNl5brtQyYdpokNRbopiLKkHWPd08Es
+CVeJOaFV6Wc0dwxu5FUdUiXSE2te4R2pt32JMl8Nnp8semNgQB+msLZ4j5lUlghYruQGvGIFAha/
+r6gjA7aUD7xubMLL1aa7DOn2wQL7Id5m3RerdELv8HQvJfTqa1VbkNud316HCkD7rRlr+/fKYIje
+2sGP1q7Vf9Q8g+7XFkyDRTNrJ9CG0Bwta/OrffGFqfUo0q3v84RLHIf8E6M6cqJaESvWJ3En7YEt
+bWaBkoe0G1h6zD8K+kZPTXhc+CtI4wSEy132tGqzZfxCnlEmIyDLPRT5ge1lFgBPGmSXZgjPjHvj
+K8Cd+RTyG/FWaha/LIWFzXg4mutCagI0GIMXTpRW+LaCtfOW3T3zvn8gdz57GSNrLNRyc0NXfeD4
+12lPFzYE+cCQYDdF3uYM2HSNrpyibXRdQr4G9dlkbgIQrImwTDsHTUB+JMWKmIJ5jqSngiCNI/on
+ccnfxkF0oE32kRbcRoxfKWMxWXEM2G/CtjJ9++ZdU6Z+Ffy7dXxd7Pj2Fxzsx2sZy/N78CsHpdls
+eVR2bJ0cpm4O6XkMqCNqo98bMDGfsVR7/mrLZqrcZdCinkqaByFrgY/bxFn63iLABJzjqls2k+g9
+vXqhnQt2sQvHnf3PmKgGwvgqo6GDoLclcqUC4wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAYYwDwYD
+VR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA1yrc4GHqMywptWU4jaWSf8FmSwwDQYJKoZIhvcNAQEM
+BQADggIBAHx47PYCLLtbfpIrXTncvtgdokIzTfnvpCo7RGkerNlFo048p9gkUbJUHJNOxO97k4Vg
+JuoJSOD1u8fpaNK7ajFxzHmuEajwmf3lH7wvqMxX63bEIaZHU1VNaL8FpO7XJqti2kM3S+LGteWy
+gxk6x9PbTZ4IevPuzz5i+6zoYMzRx6Fcg0XERczzF2sUyQQCPtIkpnnpHs6i58FZFZ8d4kuaPp92
+CC1r2LpXFNqD6v6MVenQTqnMdzGxRBF6XLE+0xRFFRhiJBPSy03OXIPBNvIQtQ6IbbjhVp+J3pZm
+OUdkLG5NrmJ7v2B0GbhWrJKsFjLtrWhV/pi60zTe9Mlhww6G9kuEYO4Ne7UyWHmRVSyBQ7N0H3qq
+JZ4d16GLuc1CLgSkZoNNiTW2bKg2SnkheCLQQrzRQDGQob4Ez8pn7fXwgNNgyYMqIgXQBztSvwye
+qiv5u+YfjyW6hY0XHgL+XVAEV8/+LbzvXMAaq7afJMbfc2hIkCwU9D9SGuTSyxTDYWnP4vkYxboz
+nxSjBF25cfe1lNj2M8FawTSLfJvdkzrnE6JwYZ+vj+vYxXX4M2bUdGc6N3ec592kD3ZDZopD8p/7
+DEJ4Y9HiD2971KE9dJeFt0g5QdYg/NA6s/rob8SKunE3vouXsXgxT7PntgMTzlSdriVZzH81Xwj3
+QEUxeCp6
+-----END CERTIFICATE-----
+
+GlobalSign Root E46
+===================
+-----BEGIN CERTIFICATE-----
+MIICCzCCAZGgAwIBAgISEdK7ujNu1LzmJGjFDYQdmOhDMAoGCCqGSM49BAMDMEYxCzAJBgNVBAYT
+AkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRwwGgYDVQQDExNHbG9iYWxTaWduIFJvb3Qg
+RTQ2MB4XDTE5MDMyMDAwMDAwMFoXDTQ2MDMyMDAwMDAwMFowRjELMAkGA1UEBhMCQkUxGTAXBgNV
+BAoTEEdsb2JhbFNpZ24gbnYtc2ExHDAaBgNVBAMTE0dsb2JhbFNpZ24gUm9vdCBFNDYwdjAQBgcq
+hkjOPQIBBgUrgQQAIgNiAAScDrHPt+ieUnd1NPqlRqetMhkytAepJ8qUuwzSChDH2omwlwxwEwkB
+jtjqR+q+soArzfwoDdusvKSGN+1wCAB16pMLey5SnCNoIwZD7JIvU4Tb+0cUB+hflGddyXqBPCCj
+QjBAMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBQxCpCPtsad0kRL
+gLWi5h+xEk8blTAKBggqhkjOPQQDAwNoADBlAjEA31SQ7Zvvi5QCkxeCmb6zniz2C5GMn0oUsfZk
+vLtoURMMA/cVi4RguYv/Uo7njLwcAjA8+RHUjE7AwWHCFUyqqx0LMV87HOIAl0Qx5v5zli/altP+
+CAezNIm8BZ/3Hobui3A=
+-----END CERTIFICATE-----
+
+GLOBALTRUST 2020
+================
+-----BEGIN CERTIFICATE-----
+MIIFgjCCA2qgAwIBAgILWku9WvtPilv6ZeUwDQYJKoZIhvcNAQELBQAwTTELMAkGA1UEBhMCQVQx
+IzAhBgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVT
+VCAyMDIwMB4XDTIwMDIxMDAwMDAwMFoXDTQwMDYxMDAwMDAwMFowTTELMAkGA1UEBhMCQVQxIzAh
+BgNVBAoTGmUtY29tbWVyY2UgbW9uaXRvcmluZyBHbWJIMRkwFwYDVQQDExBHTE9CQUxUUlVTVCAy
+MDIwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAri5WrRsc7/aVj6B3GyvTY4+ETUWi
+D59bRatZe1E0+eyLinjF3WuvvcTfk0Uev5E4C64OFudBc/jbu9G4UeDLgztzOG53ig9ZYybNpyrO
+VPu44sB8R85gfD+yc/LAGbaKkoc1DZAoouQVBGM+uq/ufF7MpotQsjj3QWPKzv9pj2gOlTblzLmM
+CcpL3TGQlsjMH/1WljTbjhzqLL6FLmPdqqmV0/0plRPwyJiT2S0WR5ARg6I6IqIoV6Lr/sCMKKCm
+fecqQjuCgGOlYx8ZzHyyZqjC0203b+J+BlHZRYQfEs4kUmSFC0iAToexIiIwquuuvuAC4EDosEKA
+A1GqtH6qRNdDYfOiaxaJSaSjpCuKAsR49GiKweR6NrFvG5Ybd0mN1MkGco/PU+PcF4UgStyYJ9OR
+JitHHmkHr96i5OTUawuzXnzUJIBHKWk7buis/UDr2O1xcSvy6Fgd60GXIsUf1DnQJ4+H4xj04KlG
+DfV0OoIu0G4skaMxXDtG6nsEEFZegB31pWXogvziB4xiRfUg3kZwhqG8k9MedKZssCz3AwyIDMvU
+clOGvGBG85hqwvG/Q/lwIHfKN0F5VVJjjVsSn8VoxIidrPIwq7ejMZdnrY8XD2zHc+0klGvIg5rQ
+mjdJBKuxFshsSUktq6HQjJLyQUp5ISXbY9e2nKd+Qmn7OmMCAwEAAaNjMGEwDwYDVR0TAQH/BAUw
+AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFNwuH9FhN3nkq9XVsxJxaD1qaJwiMB8GA1Ud
+IwQYMBaAFNwuH9FhN3nkq9XVsxJxaD1qaJwiMA0GCSqGSIb3DQEBCwUAA4ICAQCR8EICaEDuw2jA
+VC/f7GLDw56KoDEoqoOOpFaWEhCGVrqXctJUMHytGdUdaG/7FELYjQ7ztdGl4wJCXtzoRlgHNQIw
+4Lx0SsFDKv/bGtCwr2zD/cuz9X9tAy5ZVp0tLTWMstZDFyySCstd6IwPS3BD0IL/qMy/pJTAvoe9
+iuOTe8aPmxadJ2W8esVCgmxcB9CpwYhgROmYhRZf+I/KARDOJcP5YBugxZfD0yyIMaK9MOzQ0MAS
+8cE54+X1+NZK3TTN+2/BT+MAi1bikvcoskJ3ciNnxz8RFbLEAwW+uxF7Cr+obuf/WEPPm2eggAe2
+HcqtbepBEX4tdJP7wry+UUTF72glJ4DjyKDUEuzZpTcdN3y0kcra1LGWge9oXHYQSa9+pTeAsRxS
+vTOBTI/53WXZFM2KJVj04sWDpQmQ1GwUY7VA3+vA/MRYfg0UFodUJ25W5HCEuGwyEn6CMUO+1918
+oa2u1qsgEu8KwxCMSZY13At1XrFP1U80DhEgB3VDRemjEdqso5nCtnkn4rnvyOL2NSl6dPrFf4IF
+YqYK6miyeUcGbvJXqBUzxvd4Sj1Ce2t+/vdG6tHrju+IaFvowdlxfv1k7/9nR4hYJS8+hge9+6jl
+gqispdNpQ80xiEmEU5LAsTkbOYMBMMTyqfrQA71yN2BWHzZ8vTmR9W0Nv3vXkg==
+-----END CERTIFICATE-----
+
+ANF Secure Server Root CA
+=========================
+-----BEGIN CERTIFICATE-----
+MIIF7zCCA9egAwIBAgIIDdPjvGz5a7EwDQYJKoZIhvcNAQELBQAwgYQxEjAQBgNVBAUTCUc2MzI4
+NzUxMDELMAkGA1UEBhMCRVMxJzAlBgNVBAoTHkFORiBBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lv
+bjEUMBIGA1UECxMLQU5GIENBIFJhaXoxIjAgBgNVBAMTGUFORiBTZWN1cmUgU2VydmVyIFJvb3Qg
+Q0EwHhcNMTkwOTA0MTAwMDM4WhcNMzkwODMwMTAwMDM4WjCBhDESMBAGA1UEBRMJRzYzMjg3NTEw
+MQswCQYDVQQGEwJFUzEnMCUGA1UEChMeQU5GIEF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uMRQw
+EgYDVQQLEwtBTkYgQ0EgUmFpejEiMCAGA1UEAxMZQU5GIFNlY3VyZSBTZXJ2ZXIgUm9vdCBDQTCC
+AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANvrayvmZFSVgpCjcqQZAZ2cC4Ffc0m6p6zz
+BE57lgvsEeBbphzOG9INgxwruJ4dfkUyYA8H6XdYfp9qyGFOtibBTI3/TO80sh9l2Ll49a2pcbnv
+T1gdpd50IJeh7WhM3pIXS7yr/2WanvtH2Vdy8wmhrnZEE26cLUQ5vPnHO6RYPUG9tMJJo8gN0pcv
+B2VSAKduyK9o7PQUlrZXH1bDOZ8rbeTzPvY1ZNoMHKGESy9LS+IsJJ1tk0DrtSOOMspvRdOoiXse
+zx76W0OLzc2oD2rKDF65nkeP8Nm2CgtYZRczuSPkdxl9y0oukntPLxB3sY0vaJxizOBQ+OyRp1RM
+VwnVdmPF6GUe7m1qzwmd+nxPrWAI/VaZDxUse6mAq4xhj0oHdkLePfTdsiQzW7i1o0TJrH93PB0j
+7IKppuLIBkwC/qxcmZkLLxCKpvR/1Yd0DVlJRfbwcVw5Kda/SiOL9V8BY9KHcyi1Swr1+KuCLH5z
+JTIdC2MKF4EA/7Z2Xue0sUDKIbvVgFHlSFJnLNJhiQcND85Cd8BEc5xEUKDbEAotlRyBr+Qc5RQe
+8TZBAQIvfXOn3kLMTOmJDVb3n5HUA8ZsyY/b2BzgQJhdZpmYgG4t/wHFzstGH6wCxkPmrqKEPMVO
+Hj1tyRRM4y5Bu8o5vzY8KhmqQYdOpc5LMnndkEl/AgMBAAGjYzBhMB8GA1UdIwQYMBaAFJxf0Gxj
+o1+TypOYCK2Mh6UsXME3MB0GA1UdDgQWBBScX9BsY6Nfk8qTmAitjIelLFzBNzAOBgNVHQ8BAf8E
+BAMCAYYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEATh65isagmD9uw2nAalxJ
+UqzLK114OMHVVISfk/CHGT0sZonrDUL8zPB1hT+L9IBdeeUXZ701guLyPI59WzbLWoAAKfLOKyzx
+j6ptBZNscsdW699QIyjlRRA96Gejrw5VD5AJYu9LWaL2U/HANeQvwSS9eS9OICI7/RogsKQOLHDt
+dD+4E5UGUcjohybKpFtqFiGS3XNgnhAY3jyB6ugYw3yJ8otQPr0R4hUDqDZ9MwFsSBXXiJCZBMXM
+5gf0vPSQ7RPi6ovDj6MzD8EpTBNO2hVWcXNyglD2mjN8orGoGjR0ZVzO0eurU+AagNjqOknkJjCb
+5RyKqKkVMoaZkgoQI1YS4PbOTOK7vtuNknMBZi9iPrJyJ0U27U1W45eZ/zo1PqVUSlJZS2Db7v54
+EX9K3BR5YLZrZAPbFYPhor72I5dQ8AkzNqdxliXzuUJ92zg/LFis6ELhDtjTO0wugumDLmsx2d1H
+hk9tl5EuT+IocTUW0fJz/iUrB0ckYyfI+PbZa/wSMVYIwFNCr5zQM378BvAxRAMU8Vjq8moNqRGy
+g77FGr8H6lnco4g175x2MjxNBiLOFeXdntiP2t7SxDnlF4HPOEfrf4htWRvfn0IUrn7PqLBmZdo3
+r5+qPeoott7VMVgWglvquxl1AnMaykgaIZOQCo6ThKd9OyMYkomgjaw=
+-----END CERTIFICATE-----
+
+Certum EC-384 CA
+================
+-----BEGIN CERTIFICATE-----
+MIICZTCCAeugAwIBAgIQeI8nXIESUiClBNAt3bpz9DAKBggqhkjOPQQDAzB0MQswCQYDVQQGEwJQ
+TDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2Vy
+dGlmaWNhdGlvbiBBdXRob3JpdHkxGTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwHhcNMTgwMzI2
+MDcyNDU0WhcNNDMwMzI2MDcyNDU0WjB0MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERh
+dGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkx
+GTAXBgNVBAMTEENlcnR1bSBFQy0zODQgQ0EwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAATEKI6rGFtq
+vm5kN2PkzeyrOvfMobgOgknXhimfoZTy42B4mIF4Bk3y7JoOV2CDn7TmFy8as10CW4kjPMIRBSqn
+iBMY81CE1700LCeJVf/OTOffph8oxPBUw7l8t1Ot68KjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
+VR0OBBYEFI0GZnQkdjrzife81r1HfS+8EF9LMA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNo
+ADBlAjADVS2m5hjEfO/JUG7BJw+ch69u1RsIGL2SKcHvlJF40jocVYli5RsJHrpka/F2tNQCMQC0
+QoSZ/6vnnvuRlydd3LBbMHHOXjgaatkl5+r3YZJW+OraNsKHZZYuciUvf9/DE8k=
+-----END CERTIFICATE-----
+
+Certum Trusted Root CA
+======================
+-----BEGIN CERTIFICATE-----
+MIIFwDCCA6igAwIBAgIQHr9ZULjJgDdMBvfrVU+17TANBgkqhkiG9w0BAQ0FADB6MQswCQYDVQQG
+EwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0g
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0Ew
+HhcNMTgwMzE2MTIxMDEzWhcNNDMwMzE2MTIxMDEzWjB6MQswCQYDVQQGEwJQTDEhMB8GA1UEChMY
+QXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkxHzAdBgNVBAMTFkNlcnR1bSBUcnVzdGVkIFJvb3QgQ0EwggIiMA0GCSqGSIb3DQEB
+AQUAA4ICDwAwggIKAoICAQDRLY67tzbqbTeRn06TpwXkKQMlzhyC93yZn0EGze2jusDbCSzBfN8p
+fktlL5On1AFrAygYo9idBcEq2EXxkd7fO9CAAozPOA/qp1x4EaTByIVcJdPTsuclzxFUl6s1wB52
+HO8AU5853BSlLCIls3Jy/I2z5T4IHhQqNwuIPMqw9MjCoa68wb4pZ1Xi/K1ZXP69VyywkI3C7Te2
+fJmItdUDmj0VDT06qKhF8JVOJVkdzZhpu9PMMsmN74H+rX2Ju7pgE8pllWeg8xn2A1bUatMn4qGt
+g/BKEiJ3HAVz4hlxQsDsdUaakFjgao4rpUYwBI4Zshfjvqm6f1bxJAPXsiEodg42MEx51UGamqi4
+NboMOvJEGyCI98Ul1z3G4z5D3Yf+xOr1Uz5MZf87Sst4WmsXXw3Hw09Omiqi7VdNIuJGmj8PkTQk
+fVXjjJU30xrwCSss0smNtA0Aq2cpKNgB9RkEth2+dv5yXMSFytKAQd8FqKPVhJBPC/PgP5sZ0jeJ
+P/J7UhyM9uH3PAeXjA6iWYEMspA90+NZRu0PqafegGtaqge2Gcu8V/OXIXoMsSt0Puvap2ctTMSY
+njYJdmZm/Bo/6khUHL4wvYBQv3y1zgD2DGHZ5yQD4OMBgQ692IU0iL2yNqh7XAjlRICMb/gv1SHK
+HRzQ+8S1h9E6Tsd2tTVItQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBSM+xx1
+vALTn04uSNn5YFSqxLNP+jAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQENBQADggIBAEii1QAL
+LtA/vBzVtVRJHlpr9OTy4EA34MwUe7nJ+jW1dReTagVphZzNTxl4WxmB82M+w85bj/UvXgF2Ez8s
+ALnNllI5SW0ETsXpD4YN4fqzX4IS8TrOZgYkNCvozMrnadyHncI013nR03e4qllY/p0m+jiGPp2K
+h2RX5Rc64vmNueMzeMGQ2Ljdt4NR5MTMI9UGfOZR0800McD2RrsLrfw9EAUqO0qRJe6M1ISHgCq8
+CYyqOhNf6DR5UMEQGfnTKB7U0VEwKbOukGfWHwpjscWpxkIxYxeU72nLL/qMFH3EQxiJ2fAyQOaA
+4kZf5ePBAFmo+eggvIksDkc0C+pXwlM2/KfUrzHN/gLldfq5Jwn58/U7yn2fqSLLiMmq0Uc9Nneo
+WWRrJ8/vJ8HjJLWG965+Mk2weWjROeiQWMODvA8s1pfrzgzhIMfatz7DP78v3DSk+yshzWePS/Tj
+6tQ/50+6uaWTRRxmHyH6ZF5v4HaUMst19W7l9o/HuKTMqJZ9ZPskWkoDbGs4xugDQ5r3V7mzKWmT
+OPQD8rv7gmsHINFSH5pkAnuYZttcTVoP0ISVoDwUQwbKytu4QTbaakRnh6+v40URFWkIsr4WOZck
+bxJF0WddCajJFdr60qZfE2Efv4WstK2tBZQIgx51F9NxO5NQI1mg7TyRVJ12AMXDuDjb
+-----END CERTIFICATE-----
+
+TunTrust Root CA
+================
+-----BEGIN CERTIFICATE-----
+MIIFszCCA5ugAwIBAgIUEwLV4kBMkkaGFmddtLu7sms+/BMwDQYJKoZIhvcNAQELBQAwYTELMAkG
+A1UEBhMCVE4xNzA1BgNVBAoMLkFnZW5jZSBOYXRpb25hbGUgZGUgQ2VydGlmaWNhdGlvbiBFbGVj
+dHJvbmlxdWUxGTAXBgNVBAMMEFR1blRydXN0IFJvb3QgQ0EwHhcNMTkwNDI2MDg1NzU2WhcNNDQw
+NDI2MDg1NzU2WjBhMQswCQYDVQQGEwJUTjE3MDUGA1UECgwuQWdlbmNlIE5hdGlvbmFsZSBkZSBD
+ZXJ0aWZpY2F0aW9uIEVsZWN0cm9uaXF1ZTEZMBcGA1UEAwwQVHVuVHJ1c3QgUm9vdCBDQTCCAiIw
+DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMPN0/y9BFPdDCA61YguBUtB9YOCfvdZn56eY+hz
+2vYGqU8ftPkLHzmMmiDQfgbU7DTZhrx1W4eI8NLZ1KMKsmwb60ksPqxd2JQDoOw05TDENX37Jk0b
+bjBU2PWARZw5rZzJJQRNmpA+TkBuimvNKWfGzC3gdOgFVwpIUPp6Q9p+7FuaDmJ2/uqdHYVy7BG7
+NegfJ7/Boce7SBbdVtfMTqDhuazb1YMZGoXRlJfXyqNlC/M4+QKu3fZnz8k/9YosRxqZbwUN/dAd
+gjH8KcwAWJeRTIAAHDOFli/LQcKLEITDCSSJH7UP2dl3RxiSlGBcx5kDPP73lad9UKGAwqmDrViW
+VSHbhlnUr8a83YFuB9tgYv7sEG7aaAH0gxupPqJbI9dkxt/con3YS7qC0lH4Zr8GRuR5KiY2eY8f
+Tpkdso8MDhz/yV3A/ZAQprE38806JG60hZC/gLkMjNWb1sjxVj8agIl6qeIbMlEsPvLfe/ZdeikZ
+juXIvTZxi11Mwh0/rViizz1wTaZQmCXcI/m4WEEIcb9PuISgjwBUFfyRbVinljvrS5YnzWuioYas
+DXxU5mZMZl+QviGaAkYt5IPCgLnPSz7ofzwB7I9ezX/SKEIBlYrilz0QIX32nRzFNKHsLA4KUiwS
+VXAkPcvCFDVDXSdOvsC9qnyW5/yeYa1E0wCXAgMBAAGjYzBhMB0GA1UdDgQWBBQGmpsfU33x9aTI
+04Y+oXNZtPdEITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFAaamx9TffH1pMjThj6hc1m0
+90QhMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAqgVutt0Vyb+zxiD2BkewhpMl
+0425yAA/l/VSJ4hxyXT968pk21vvHl26v9Hr7lxpuhbI87mP0zYuQEkHDVneixCwSQXi/5E/S7fd
+Ao74gShczNxtr18UnH1YeA32gAm56Q6XKRm4t+v4FstVEuTGfbvE7Pi1HE4+Z7/FXxttbUcoqgRY
+YdZ2vyJ/0Adqp2RT8JeNnYA/u8EH22Wv5psymsNUk8QcCMNE+3tjEUPRahphanltkE8pjkcFwRJp
+adbGNjHh/PqAulxPxOu3Mqz4dWEX1xAZufHSCe96Qp1bWgvUxpVOKs7/B9dPfhgGiPEZtdmYu65x
+xBzndFlY7wyJz4sfdZMaBBSSSFCp61cpABbjNhzI+L/wM9VBD8TMPN3pM0MBkRArHtG5Xc0yGYuP
+jCB31yLEQtyEFpslbei0VXF/sHyz03FJuc9SpAQ/3D2gu68zngowYI7bnV2UqL1g52KAdoGDDIzM
+MEZJ4gzSqK/rYXHv5yJiqfdcZGyfFoxnNidF9Ql7v/YQCvGwjVRDjAS6oz/v4jXH+XTgbzRB0L9z
+ZVcg+ZtnemZoJE6AZb0QmQZZ8mWvuMZHu/2QeItBcy6vVR/cO5JyboTT0GFMDcx2V+IthSIVNg3r
+AZ3r2OvEhJn7wAzMMujjd9qDRIueVSjAi1jTkD5OGwDxFa2DK5o=
+-----END CERTIFICATE-----
+
+HARICA TLS RSA Root CA 2021
+===========================
+-----BEGIN CERTIFICATE-----
+MIIFpDCCA4ygAwIBAgIQOcqTHO9D88aOk8f0ZIk4fjANBgkqhkiG9w0BAQsFADBsMQswCQYDVQQG
+EwJHUjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u
+cyBDQTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBSU0EgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTEwNTUz
+OFoXDTQ1MDIxMzEwNTUzN1owbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRl
+bWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgUlNB
+IFJvb3QgQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAIvC569lmwVnlskN
+JLnQDmT8zuIkGCyEf3dRywQRNrhe7Wlxp57kJQmXZ8FHws+RFjZiPTgE4VGC/6zStGndLuwRo0Xu
+a2s7TL+MjaQenRG56Tj5eg4MmOIjHdFOY9TnuEFE+2uva9of08WRiFukiZLRgeaMOVig1mlDqa2Y
+Ulhu2wr7a89o+uOkXjpFc5gH6l8Cct4MpbOfrqkdtx2z/IpZ525yZa31MJQjB/OCFks1mJxTuy/K
+5FrZx40d/JiZ+yykgmvwKh+OC19xXFyuQnspiYHLA6OZyoieC0AJQTPb5lh6/a6ZcMBaD9YThnEv
+dmn8kN3bLW7R8pv1GmuebxWMevBLKKAiOIAkbDakO/IwkfN4E8/BPzWr8R0RI7VDIp4BkrcYAuUR
+0YLbFQDMYTfBKnya4dC6s1BG7oKsnTH4+yPiAwBIcKMJJnkVU2DzOFytOOqBAGMUuTNe3QvboEUH
+GjMJ+E20pwKmafTCWQWIZYVWrkvL4N48fS0ayOn7H6NhStYqE613TBoYm5EPWNgGVMWX+Ko/IIqm
+haZ39qb8HOLubpQzKoNQhArlT4b4UEV4AIHrW2jjJo3Me1xR9BQsQL4aYB16cmEdH2MtiKrOokWQ
+CPxrvrNQKlr9qEgYRtaQQJKQCoReaDH46+0N0x3GfZkYVVYnZS6NRcUk7M7jAgMBAAGjQjBAMA8G
+A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFApII6ZgpJIKM+qTW8VX6iVNvRLuMA4GA1UdDwEB/wQE
+AwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAPpBIqm5iFSVmewzVjIuJndftTgfvnNAUX15QvWiWkKQU
+EapobQk1OUAJ2vQJLDSle1mESSmXdMgHHkdt8s4cUCbjnj1AUz/3f5Z2EMVGpdAgS1D0NTsY9FVq
+QRtHBmg8uwkIYtlfVUKqrFOFrJVWNlar5AWMxajaH6NpvVMPxP/cyuN+8kyIhkdGGvMA9YCRotxD
+QpSbIPDRzbLrLFPCU3hKTwSUQZqPJzLB5UkZv/HywouoCjkxKLR9YjYsTewfM7Z+d21+UPCfDtcR
+j88YxeMn/ibvBZ3PzzfF0HvaO7AWhAw6k9a+F9sPPg4ZeAnHqQJyIkv3N3a6dcSFA1pj1bF1BcK5
+vZStjBWZp5N99sXzqnTPBIWUmAD04vnKJGW/4GKvyMX6ssmeVkjaef2WdhW+o45WxLM0/L5H9MG0
+qPzVMIho7suuyWPEdr6sOBjhXlzPrjoiUevRi7PzKzMHVIf6tLITe7pTBGIBnfHAT+7hOtSLIBD6
+Alfm78ELt5BGnBkpjNxvoEppaZS3JGWg/6w/zgH7IS79aPib8qXPMThcFarmlwDB31qlpzmq6YR/
+PFGoOtmUW4y/Twhx5duoXNTSpv4Ao8YWxw/ogM4cKGR0GQjTQuPOAF1/sdwTsOEFy9EgqoZ0njnn
+kf3/W9b3raYvAwtt41dU63ZTGI0RmLo=
+-----END CERTIFICATE-----
+
+HARICA TLS ECC Root CA 2021
+===========================
+-----BEGIN CERTIFICATE-----
+MIICVDCCAdugAwIBAgIQZ3SdjXfYO2rbIvT/WeK/zjAKBggqhkjOPQQDAzBsMQswCQYDVQQGEwJH
+UjE3MDUGA1UECgwuSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBD
+QTEkMCIGA1UEAwwbSEFSSUNBIFRMUyBFQ0MgUm9vdCBDQSAyMDIxMB4XDTIxMDIxOTExMDExMFoX
+DTQ1MDIxMzExMDEwOVowbDELMAkGA1UEBhMCR1IxNzA1BgNVBAoMLkhlbGxlbmljIEFjYWRlbWlj
+IGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ0ExJDAiBgNVBAMMG0hBUklDQSBUTFMgRUNDIFJv
+b3QgQ0EgMjAyMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABDgI/rGgltJ6rK9JOtDA4MM7KKrxcm1l
+AEeIhPyaJmuqS7psBAqIXhfyVYf8MLA04jRYVxqEU+kw2anylnTDUR9YSTHMmE5gEYd103KUkE+b
+ECUqqHgtvpBBWJAVcqeht6NCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUyRtTgRL+BNUW
+0aq8mm+3oJUZbsowDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2cAMGQCMBHervjcToiwqfAi
+rcJRQO9gcS3ujwLEXQNwSaSS6sUUiHCm0w2wqsosQJz76YJumgIwK0eaB8bRwoF8yguWGEEbo/Qw
+CZ61IygNnxS2PFOiTAZpffpskcYqSUXm7LcT4Tps
+-----END CERTIFICATE-----
diff --git a/doc/conf/unrealircd.hub.conf b/doc/conf/unrealircd.hub.conf
@@ -16,9 +16,10 @@ link services.supernets.org {
 	class servers;
 }
 
-log "ircd.log" { flags { errors; } maxsize 1K; }
-
-except ban { mask *@127.0.0.1; }
+log {
+	source { error; fatal; warn; }
+	destination { file "ircd.log" { maxsize 10M; } }
+}
 
 ulines { services.supernets.org; }
 
diff --git a/doc/conf/unrealircd.remote.conf b/doc/conf/unrealircd.remote.conf
@@ -14,8 +14,8 @@ alias os { target operserv; type services; }
 class clients { pingfreq 120; maxclients 100; sendq 1M; options { nofakelag; } }
 class servers { pingfreq 120; maxclients  10; sendq 1M; connfreq 30;           }
 
-allow { ip *;         class clients; maxperip 2;  global-maxperip 2;  }
-allow { ip 127.0.0.1; class clients; maxperip 10; global-maxperip 10; }
+allow { mask *;         class clients; maxperip 2;  global-maxperip 2;  }
+allow { mask 127.0.0.1; class clients; maxperip 10; global-maxperip 10; }
 
 #require authentication {
 #	mask *@*;
@@ -26,9 +26,10 @@ listen { ip *; port 6667;      options { clientsonly;      } }
 listen { ip *; port 6697;      options { clientsonly; tls; } }
 listen { ip *; port REDACTED;  options { serversonly; tls; } }
 
-deny channel { channel "#pumpcoin"; reason "This channel has moved to #exchange";  redirect "#exchange";  }
 deny channel { channel "#dev";      reason "This channel has moved to #superbowl"; redirect "#superbowl"; }
 deny channel { channel "#help";     reason "This channel has moved to #superbowl"; redirect "#superbowl"; }
+deny channel { channel "#mensa";    reason "This channel has been closed";         redirect "#superbowl"; }
+deny channel { channel "#pumpcoin"; reason "This channel has moved to #exchange";  redirect "#exchange";  }
 
 link irc.supernets.org {
 	incoming { mask REDACTED; }
@@ -42,7 +43,15 @@ link irc.supernets.org {
 	class servers;
 }
 
-log "errors.log" { flags { errors; } maxsize 10K; }
+log {
+	source { error; fatal; warn; }
+	destination { file "ircd.log" { maxsize 10M; } }
+}
+
+log {
+	source { all; }
+	destination { channel "#REDACTED" }
+}
 
 tld { mask *@*; motd remote.motd; rules remote.motd; options { remote; } }
 
@@ -81,39 +90,28 @@ blacklist torbl {
 	reason "8,4   E N T E R   T H E   V O I D   ";
 }
 
-webirc { mask 107.161.19.53;  password "REDACTED"; } # KiwiIRC
-webirc { mask 107.161.19.109; password "REDACTED"; }
-webirc { mask 107.161.31.4;   password "REDACTED"; }
-
-webirc { mask 207.192.75.252; password "REDACTED"; } # Mibbit
-webirc { mask 64.62.228.82;   password "REDACTED"; }
-webirc { mask 78.129.202.38;  password "REDACTED"; }
-webirc { mask 109.169.29.95 ; password "REDACTED"; }
-
 set {
 	kline-address "enterthevoid@supernets.org";
 	gline-address "enterthevoid@supernets.org";
 	modes-on-connect "+iIpTx";
 	modes-on-oper "+Hq";
-	snomask-on-oper "+bcFfkGsSo";
+	snomask-on-oper "+bBcCfksSoO";
 	modes-on-join "+ns";
 	level-on-join "op";
 	restrict-usermodes "ips";
 	restrict-channelmodes "nLpPs";
 	restrict-commands {
-		channel-message { connect-delay 60;   exempt-identified yes; exempt-reputation-score 100; }
-		channel-notice  { connect-delay 60;   exempt-identified yes; exempt-reputation-score 100; }
-		invite          { connect-delay 3600; exempt-identified yes; exempt-reputation-score 100; }
-		join            { connect-delay 15;   exempt-identified yes; exempt-reputation-score 100; }
-		list            { connect-delay 30;   exempt-identified yes; exempt-reputation-score 100; }
-		private-message { connect-delay 300;  exempt-identified yes; exempt-reputation-score 100; }
-		private-notice  { connect-delay 3600; exempt-identified yes; exempt-reputation-score 100; }
+		channel-message { connect-delay 60;  exempt-identified yes; exempt-reputation-score 100; }
+		channel-notice  { connect-delay 60;  exempt-identified yes; exempt-reputation-score 100; }
+		invite          { connect-delay 300; exempt-identified yes; exempt-reputation-score 100; }
+		join            { connect-delay 15;  exempt-identified yes; exempt-reputation-score 100; }
+		list            { connect-delay 30;  exempt-identified yes; exempt-reputation-score 100; }
+		private-message { connect-delay 300; exempt-identified yes; exempt-reputation-score 100; }
+		private-notice  { connect-delay 300; exempt-identified yes; exempt-reputation-score 100; }
 	}
-	#auto-join "#superbowl";
-	oper-auto-join "#superbowl";
+	auto-join "#superbowl";
 	static-quit "EMO-QUIT";
 	static-part "EMO-PART";
-	who-limit 100;
 	nick-length 20;
 	maxchannelsperuser 10;
 	channel-command-prefix "`!@$.";
@@ -134,15 +132,15 @@ set {
 		user warn;
 		oper deny;
 		server deny;
-		user-message "4WARNING: You are not using a secure (SSL/TLS) connection";
-		oper-message "Network operators must connect using SSL/TLS";
+		user-message "4WARNING: You are not on a secure TLS connection";
+		oper-message "Network operators must be on a secure TLS connection";
 	}
 	outdated-tls-policy {
 		user warn;
 		oper deny;
 		server deny;
 		user-message "4WARNING: You are using an outdated SSL/TLS protocol or cipher";
-		oper-message "Network operators must connect using an up-to-date SSL/TLS protocol or cipher";
+		oper-message "Network operators must be using an up-to-date SSL/TLS protocol & cipher";
 	}
 	anti-flood {
 		everyone {
@@ -152,14 +150,14 @@ set {
 				ban-action gzline;
 				ban-time 1h;
 			}
-			target-flood {
-				channel-notice  15:5;
-				channel-privmsg 45:5;
-				channel-tagmsg  15:5;
-				private-notice  10:5;
-				private-privmsg 30:5;
-				private-tagmsg  10:5;
-			}
+			#target-flood {
+			#	channel-notice  15:5;
+			#	channel-privmsg 45:5;
+			#	channel-tagmsg  15:5;
+			#	private-notice  10:5;
+			#	private-privmsg 30:5;
+			#	private-tagmsg  10:5;
+			#}
 		}
 		known-users {
 			away-flood   3:300;
@@ -171,6 +169,8 @@ set {
 				users 5;
 				new-user-every 60s;
 			}
+			lag-penalty 10; # update?
+			lag-penalty-bytes 0;
 		}
 		unknown-users {
 			away-flood   3:300;
@@ -182,6 +182,8 @@ set {
 				users 3;
 				new-user-every 60s;
 			}
+			lag-penalty 1000;
+			lag-penalty-bytes 90;
 		}
 	}
 	default-bantime 30d;
@@ -207,32 +209,50 @@ set {
 		ban-reason "8,4   E N T E R   T H E   V O I D   ";
 	}
 	connthrottle {
-		known-users   { minimum-reputation-score 100; sasl-bypass yes;       }
-		new-users     { local-throttle 20:60;         global-throttle 30:60; }
-		disabled-when { reputation-gathering 1w;      start-delay 3m;        }
+		known-users   { minimum-reputation-score 25; sasl-bypass yes;       }
+		new-users     { local-throttle 20:60;        global-throttle 30:60; }
+		disabled-when { reputation-gathering 1w;     start-delay 3m;        }
 	}
 	history {
 		channel {
-			playback-on-join { lines 100; time 1d; }
+			playback-on-join { lines 1000; time 1d; }
 			max-storage-per-channel {
-				registered   { lines 100; time 1d; } 
-				unregistered { lines 50;  time 1h; } 
+				registered   { lines 1000; time 1d; } 
+				unregistered { lines 100;  time 1h; } 
 			}
 		}
 	}
-	hide-idle-time { policy usermode; }
+	hide-idle-time { policy always; }
+	whois-details {
+		basic           { everyone full; }
+		modes           { everyone none;    self full; oper full; }
+		realhost        { everyone none;    self full; oper full; }
+		registered-nick { everyone full; }
+		channels        { everyone limited; self full; oper full; }
+		server          { everyone full; }
+		away            { everyone full; }
+		oper            { everyone limited; self full; oper full; }
+		secure          { everyone limited; self full; oper full; }
+		bot             { everyone full; }
+		services        { everyone full; }
+		reputation      { everyone none;    self none; oper full; }
+		geo             { everyone none;    self none; oper full; }
+		certfp          { everyone full; }
+		shunned         { everyone none;    self none; oper full; }
+		account         { everyone full; }
+		swhois          { everyone full; }
+		idle            { everyone limited; self full; oper full; }
+	}
 }
 
 hideserver {
 	disable-map yes;
 	disable-links yes;
-	map-deny-message "Denied";
-	links-deny-message "Denied";
+	map-deny-message "8,4   E N T E R   T H E   V O I D   ";
+	links-deny-message "8,4   E N T E R   T H E   V O I D   ";
 }
 
 security-group known-users {
 	identified yes;
-	webirc no;
-	tls no;
-	reputation-score 100;
+	reputation-score 25;
 }
 \ No newline at end of file
diff --git a/doc/translations.txt b/doc/translations.txt
@@ -1,6 +1,6 @@
 ==[ Translations ]===========================================================
 
-In UnrealIRCd 5 we support the following translations:
+In UnrealIRCd we support the following translations:
 * on-line documentation at https://www.unrealircd.org/docs/ (wiki!)
 * help.conf
 * example.conf
diff --git a/extras/build-tests/nix/build b/extras/build-tests/nix/build
@@ -16,7 +16,7 @@ else
 	export MAKE="make -j4"
 fi
 
-export CPPFLAGS="-DFAKELAG_CONFIGURABLE -DNOREMOVETMP"
+export CPPFLAGS="-DFAKELAG_CONFIGURABLE -DNOREMOVETMP -DRAWCMDLOGGING"
 
 # !! skipped for now: extras/build-tests/nix/select-config $BUILDCONFIG !!
 # !! temporary use this:
@@ -27,6 +27,16 @@ if lsb_release -av 2>&1|egrep 'Debian.*jessie'; then
 	echo "Disabling ASan due to false positives on deb8"
 	echo 'EXTRAPARA="--enable-werror --disable-asan"' >>config.settings
 fi
+if uname -s|grep -i freebsd; then
+	echo "Disabling ASan on FreeBSD due to 100% CPU loop in OpenSSL initialization routine"
+	echo 'EXTRAPARA="--enable-werror --disable-asan"' >>config.settings
+fi
+
+# If SSLDIR is set the environment, this overrides config.settings
+# Used for example in the openssl3 build tests.
+if [ "$SSLDIR" != "" ]; then
+	echo 'SSLDIR="'"$SSLDIR"'"' >>config.settings
+fi
 
 # Read config.settings, this makes a couple of variables available to us.
 . ./config.settings
@@ -36,10 +46,10 @@ if [ "$SSLDIR" != "" ]; then
 fi
 ./Config -quick || (tail -n 5000 config.log; exit 1)
 $MAKE
-yes ''|make pem
-make
+yes ''|$MAKE pem
+$MAKE || exit 1
 ./unrealircd module install third/dumpcmds
-make install
+$MAKE install || exit 1
 
 set +x
 echo ""
diff --git a/extras/build-tests/nix/configs/default b/extras/build-tests/nix/configs/default
@@ -1,3 +1,9 @@
+# These are the settings saved from running './Config'.
+# Note that it is not recommended to edit config.settings by hand!
+# Chances are you misunderstand what a variable does or what the
+# supported values are. You better just re-run the ./Config script
+# and answer appropriately there, to get a correct config.settings
+# file.
 #
 BASEPATH=$HOME/unrealircd
 BINDIR=$HOME/unrealircd/bin
@@ -9,16 +15,16 @@ CACHEDIR=$HOME/unrealircd/cache
 DOCDIR=$HOME/unrealircd/doc
 TMPDIR=$HOME/unrealircd/tmp
 PRIVATELIBDIR=$HOME/unrealircd/lib
-PREFIXAQ="1"
-MAXCONNECTIONS="1024"
+MAXCONNECTIONS_REQUEST="auto"
 NICKNAMEHISTORYLENGTH="2000"
+GEOIP="classic"
 DEFPERM="0600"
 SSLDIR=""
 REMOTEINC=""
 CURLDIR=""
-SHOWLISTMODES="1"
 NOOPEROVERRIDE=""
 OPEROVERRIDEVERIFY=""
 GENCERTIFICATE="0"
-EXTRAPARA="--enable-werror --enable-asan"
+SANITIZER="asan"
+EXTRAPARA="--enable-werror"
 ADVANCED=""
diff --git a/extras/build-tests/nix/run-tests b/extras/build-tests/nix/run-tests
@@ -19,8 +19,13 @@ if [ ! -d ~/cipherscan ]; then
 	git clone -q https://github.com/mozilla/cipherscan
 fi
 
+if [ "$HOSTNAME" = "deb8" ]; then
+	echo "Not running tests on Debian 8. It's LTS is EOL and trouble with running tests."
+	exit 0
+fi
+
 # Install 'unrealircd-tests'
-git clone -q https://github.com/unrealircd/unrealircd-tests.git
+git clone -q --branch unreal60 https://github.com/unrealircd/unrealircd-tests.git unrealircd-tests
 cd unrealircd-tests
 
 # FreeBSD has various issues with the tests from us and others,
diff --git a/extras/build-tests/windows/build.bat b/extras/build-tests/windows/build.bat
@@ -16,35 +16,44 @@ rem cinst innosetup -y
 
 rem Installing UnrealIRCd dependencies
 cd \projects
-mkdir unrealircd-5-libs
-cd unrealircd-5-libs
-curl -fsS -o unrealircd-libraries-5-devel.zip https://www.unrealircd.org/files/dev/win/libs/unrealircd-libraries-5-devel.zip
-unzip unrealircd-libraries-5-devel.zip
-copy dlltool.exe \users\user\worker\unreal5-w10\build /y
+mkdir unrealircd-6-libs
+cd unrealircd-6-libs
+curl -fsS -o unrealircd-libraries-6-devel.zip https://www.unrealircd.org/files/dev/win/libs/unrealircd-libraries-6-devel.zip
+unzip unrealircd-libraries-6-devel.zip
+copy dlltool.exe \users\user\worker\unreal6-w10\build /y
 
-rem for appveyor: cd \projects\unrealircd
-cd \users\user\worker\unreal5-w10\build
+rem for appveyor, use: cd \projects\unrealircd
+cd \users\user\worker\unreal6-w10\build
 
-rem Now the actual build
-call extras\build-tests\windows\compilecmd\%SHORTNAME%.bat
+rem Install 'unrealircd-tests'
+cd ..
+rd /q/s unrealircd-tests
+git clone -q --branch unreal60 https://github.com/unrealircd/unrealircd-tests.git unrealircd-tests
+if %ERRORLEVEL% NEQ 0 EXIT /B 1
+cd build
 
-rem The above command will fail, due to missing symbol file
-rem However the symbol file can only be generated after the above command
-rem So... we create the symbolfile...
+rem Now the actual build
+rem - First this, otherwise JOM will fail
+IF NOT EXIST src\version.c nmake -f Makefile.windows CONF
+rem - Then build most of UnrealIRCd.exe etc
+call extras\build-tests\windows\compilecmd\%SHORTNAME%.bat UNREALSVC.EXE UnrealIRCd.exe
+rem - It will fail due to missing symbolfile, which we create here..
 nmake -f makefile.windows SYMBOLFILE
-
-rem And we re-run the exact same command:
-call extras\build-tests\windows\compilecmd\%SHORTNAME%.bat
+rem - Then we finalize building UnrealIRCd.exe: should be no error
+call extras\build-tests\windows\compilecmd\%SHORTNAME%.bat UNREALSVC.EXE UnrealIRCd.exe
+if %ERRORLEVEL% NEQ 0 EXIT /B 1
+rem - Build all the modules (DLL files): should be no error
+call extras\build-tests\windows\compilecmd\%SHORTNAME%.bat MODULES
 if %ERRORLEVEL% NEQ 0 EXIT /B 1
 
 rem Compile dependencies for unrealircd-tests -- this doesn't belong here though..
-curl -fsS -o src\modules\third\fakereputation.c https://raw.githubusercontent.com/unrealircd/unrealircd-tests/master/serverconfig/unrealircd/modules/fakereputation.c
+copy ..\unrealircd-tests\serverconfig\unrealircd\modules\fakereputation.c src\modules\third /Y
 call extras\build-tests\windows\compilecmd\%SHORTNAME%.bat CUSTOMMODULE MODULEFILE=fakereputation
 if %ERRORLEVEL% NEQ 0 EXIT /B 1
 
-rem Convert c:\dev to c:\projects\unrealircd-5-libs
+rem Convert c:\dev to c:\projects\unrealircd-6-libs
 rem TODO: should use environment variable in innosetup script?
-sed -i "s/c:\\dev\\unrealircd-5-libs/c:\\projects\\unrealircd-5-libs/gi" src\windows\unrealinst.iss
+sed -i "s/c:\\dev\\unrealircd-6-libs/c:\\projects\\unrealircd-6-libs/gi" src\windows\unrealinst.iss
 
 rem Build installer file
 "c:\Program Files (x86)\Inno Setup 5\iscc.exe" /Q- src\windows\unrealinst.iss
@@ -60,7 +69,7 @@ taskkill -im unrealircd.exe -f
 sleep 2
 rem Just a safety measure so we don't end up testing
 rem some old version...
-del "C:\Program Files\UnrealIRCd 5\bin\unrealircd.exe"
+del "C:\Program Files\UnrealIRCd 6\bin\unrealircd.exe"
 
 echo Running installer...
 start /WAIT unrealircd-dev-build.exe /VERYSILENT /LOG=setup.log
@@ -70,12 +79,7 @@ rem Upload artifact
 rem appveyor PushArtifact unrealircd-dev-build.exe
 rem if %ERRORLEVEL% NEQ 0 EXIT /B 1
 
-rem Install 'unrealircd-tests'
-cd ..
-rd /q/s unrealircd-tests
-git clone https://github.com/unrealircd/unrealircd-tests.git
-if %ERRORLEVEL% NEQ 0 EXIT /B 1
-cd unrealircd-tests
+cd ..\unrealircd-tests
 dir
 
 rem All tests except db:
diff --git a/extras/build-tests/windows/compilecmd/vs2019.bat b/extras/build-tests/windows/compilecmd/vs2019.bat
@@ -1,21 +1,30 @@
 rem Build command for Visual Studio 2019
 
-nmake -f makefile.windows ^
-LIBRESSL_INC_DIR="c:\projects\unrealircd-5-libs\libressl\include" ^
-LIBRESSL_LIB_DIR="c:\projects\unrealircd-5-libs\libressl\lib" ^
-SSLLIB="crypto-46.lib ssl-48.lib" ^
+rem This used to start with:
+rem nmake -f makefile.windows ^
+rem But nowadays we use JOM for parallel builds:
+jom /j32 -f makefile.windows ^
+LIBRESSL_INC_DIR="c:\projects\unrealircd-6-libs\libressl\include" ^
+LIBRESSL_LIB_DIR="c:\projects\unrealircd-6-libs\libressl\lib" ^
+SSLLIB="crypto-47.lib ssl-50.lib" ^
 USE_REMOTEINC=1 ^
-LIBCURL_INC_DIR="c:\projects\unrealircd-5-libs\curl\include" ^
-LIBCURL_LIB_DIR="c:\projects\unrealircd-5-libs\curl\builds\libcurl-vc-x64-release-dll-ssl-dll-cares-dll-ipv6-obj-lib" ^
-CARES_LIB_DIR="c:\projects\unrealircd-5-libs\c-ares\msvc\cares\dll-release" ^
-CARES_INC_DIR="c:\projects\unrealircd-5-libs\c-ares\include" ^
+LIBCURL_INC_DIR="c:\projects\unrealircd-6-libs\curl\include" ^
+LIBCURL_LIB_DIR="c:\projects\unrealircd-6-libs\curl\builds\libcurl-vc-x64-release-dll-ssl-dll-cares-dll-ipv6-obj-lib" ^
+CARES_LIB_DIR="c:\projects\unrealircd-6-libs\c-ares\msvc\cares\dll-release" ^
+CARES_INC_DIR="c:\projects\unrealircd-6-libs\c-ares\include" ^
 CARESLIB="cares.lib" ^
-PCRE2_INC_DIR="c:\projects\unrealircd-5-libs\pcre2\include" ^
-PCRE2_LIB_DIR="c:\projects\unrealircd-5-libs\pcre2\lib" ^
+PCRE2_INC_DIR="c:\projects\unrealircd-6-libs\pcre2\include" ^
+PCRE2_LIB_DIR="c:\projects\unrealircd-6-libs\pcre2\lib" ^
 PCRE2LIB="pcre2-8.lib" ^
-ARGON2_LIB_DIR="c:\projects\unrealircd-5-libs\argon2\vs2015\build" ^
-ARGON2_INC_DIR="c:\projects\unrealircd-5-libs\argon2\include" ^
+ARGON2_LIB_DIR="c:\projects\unrealircd-6-libs\argon2\vs2015\build" ^
+ARGON2_INC_DIR="c:\projects\unrealircd-6-libs\argon2\include" ^
 ARGON2LIB="Argon2RefDll.lib" ^
-SODIUM_LIB_DIR="c:\projects\unrealircd-5-libs\libsodium\bin\x64\Release\v142\dynamic" ^
-SODIUM_INC_DIR="c:\projects\unrealircd-5-libs\libsodium\src\libsodium\include" ^
-SODIUMLIB="libsodium.lib" %*
+SODIUM_LIB_DIR="c:\projects\unrealircd-6-libs\libsodium\bin\x64\Release\v142\dynamic" ^
+SODIUM_INC_DIR="c:\projects\unrealircd-6-libs\libsodium\src\libsodium\include" ^
+SODIUMLIB="libsodium.lib" ^
+JANSSON_LIB_DIR="c:\projects\unrealircd-6-libs\jansson\lib" ^
+JANSSON_INC_DIR="c:\projects\unrealircd-6-libs\jansson\include" ^
+JANSSONLIB="jansson.lib" ^
+GEOIPCLASSIC_LIB_DIR="c:\projects\unrealircd-6-libs\GeoIP\libGeoIP" ^
+GEOIPCLASSIC_INC_DIR="c:\projects\unrealircd-6-libs\GeoIP\libGeoIP" ^
+GEOIPCLASSICLIB="GeoIP.lib" %*
diff --git a/extras/c-ares.tar.gz b/extras/c-ares.tar.gz
Binary files differ.
diff --git a/extras/curlinstall b/extras/curlinstall
@@ -4,7 +4,7 @@ OUTF="curl-latest.tar.gz"
 OUTD="curl-latest"
 ARESPATH="`pwd`/extras/c-ares"
 UNREALDIR="`pwd`"
-CARESVERSION="1.17.1"
+CARESVERSION="1.17.2"
 LIBDIR="$1"
 
 if [ "x$1" = "x" ]; then
diff --git a/extras/doxygen/Developers.md b/extras/doxygen/Developers.md
@@ -1,4 +1,4 @@
-Welcome to the doxygen-generated documentation for the UnrealIRCd 5.x API.
+Welcome to the doxygen-generated documentation for the UnrealIRCd 6.x API.
 This is intended **for developers only!**
 
 If you are creating a 3rd party module for UnrealIRCd or are interested
diff --git a/extras/doxygen/Doxyfile b/extras/doxygen/Doxyfile
@@ -38,7 +38,7 @@ PROJECT_NAME           = "UnrealIRCd"
 # could be handy for archiving the generated documentation or if some version
 # control system is used.
 
-PROJECT_NUMBER         = 5.2.0.1
+PROJECT_NUMBER         = 6.0.1.1
 
 # Using the PROJECT_BRIEF tag one can provide an optional one line description
 # for a project that appears at the top of each page and should give viewer a
diff --git a/extras/geoip-classic.tar.gz b/extras/geoip-classic.tar.gz
Binary files differ.
diff --git a/extras/jansson.tar.gz b/extras/jansson.tar.gz
Binary files differ.
diff --git a/extras/security/apparmor/unrealircd b/extras/security/apparmor/unrealircd
@@ -1,9 +1,9 @@
-# AppArmor profile for UnrealIRCd 5
+# AppArmor profile for UnrealIRCd 6
 #
 # Note that you may still see some DENIED warnings in logs with
 # operation="chmod". These are harmless and can be safely ignored.
 #
-# Tested on Ubuntu 16.04 LTS and Ubuntu 18.04 LTS
+# Tested on Ubuntu 16.04 LTS, Ubuntu 18.04 LTS, Ubuntu 20.04 LTS
 #
 # IMPORTANT: you will have to modify the path to executable below
 #            if it's not /home/ircd/unrealircd/bin/unrealircd !
diff --git a/extras/tests/tls/cipherscan_profiles/openssl-300.txt b/extras/tests/tls/cipherscan_profiles/openssl-300.txt
@@ -0,0 +1,27 @@
+Target: 127.0.0.1:5901
+
+prio  ciphersuite                    protocols  pfs                 curves
+1     ECDHE-ECDSA-AES256-GCM-SHA384  TLSv1.2    ECDH,P-521,521bits  secp521r1,secp384r1
+2     ECDHE-ECDSA-AES128-GCM-SHA256  TLSv1.2    ECDH,P-521,521bits  secp521r1,secp384r1
+3     ECDHE-ECDSA-AES256-SHA384      TLSv1.2    ECDH,P-521,521bits  secp521r1,secp384r1
+4     ECDHE-ECDSA-AES128-SHA256      TLSv1.2    ECDH,P-521,521bits  secp521r1,secp384r1
+5     ECDHE-ECDSA-AES256-SHA         TLSv1.2    ECDH,P-521,521bits  secp521r1,secp384r1
+6     ECDHE-ECDSA-AES128-SHA         TLSv1.2    ECDH,P-521,521bits  secp521r1,secp384r1
+
+Certificate: untrusted, 384 bits, ecdsa-with-SHA256 signature
+TLS ticket lifetime hint: None
+NPN protocols: None
+OCSP stapling: not supported
+Cipher ordering: server
+Curves ordering: server - fallback: no
+Server supports secure renegotiation
+Server supported compression methods: NONE
+TLS Tolerance: yes
+
+Intolerance to:
+ SSL 3.254           : absent
+ TLS 1.0             : PRESENT
+ TLS 1.1             : PRESENT
+ TLS 1.2             : absent
+ TLS 1.3             : absent
+ TLS 1.4             : absent
diff --git a/extras/tls.cnf b/extras/tls.cnf
@@ -18,7 +18,7 @@ stateOrProvinceName_default     = New York
 localityName                    = Locality Name (eg, city)
 
 0.organizationName              = Organization Name (eg, company)
-0.organizationName_default      = SuperNETs
+0.organizationName_default      = IRC geeks
 
 organizationalUnitName          = Organizational Unit Name (eg, section)
 organizationalUnitName_default  = IRCd  
diff --git a/extras/unrealircd-upgrade-script.in b/extras/unrealircd-upgrade-script.in
@@ -1,11 +1,11 @@
-#!/bin/bash
+#!/usr/bin/env bash
 #
 # This is stage 1 of the UnrealIRCd upgrade script
 # It downloads stage 2 online, verifies the integrity, and then
 # passes control to it to proceed with the rest of the upgrade.
 #
-# This is a bash script, so it is less cross-platform than
-# the rest of UnrealIRCd. We also mostly assume Linux here.
+# This is a bash script, so it is less cross-platform than the
+# rest of UnrealIRCd. We also mostly assume Linux/FreeBSD here.
 #
 
 BUILDDIR="@BUILDDIR@"
@@ -55,13 +55,19 @@ if [ ! -d "$BUILDDIR" ]; then
 	exit 1
 fi
 
+FETCHER="wget"
 if ! wget --help 1>/dev/null 2>&1; then
-	echo "The tool 'wget' is missing, which is used by this script."
-	echo "On Linux consider running 'sudo apt install wget' or 'sudo yum install wget'"
-	echo "and run this script again."
-	echo "Or, don't use this script and follow the manual upgrade procedure from"
-	echo "https://www.unrealircd.org/docs/Upgrading"
-	exit 1
+	# fetch is a pain: it always returns 1 (false) even for usage info and has no --version
+	fetch 1>/dev/null 2>&1
+	if [ "$?" -ne 1 ]; then
+		echo "The tool 'wget' is missing, which is used by this script."
+		echo "On Linux consider running 'sudo apt install wget' or 'sudo yum install wget'"
+		echo "and run this script again."
+		echo "Or, don't use this script and follow the manual upgrade procedure from"
+		echo "https://www.unrealircd.org/docs/Upgrading"
+		exit 1
+	fi
+	FETCHER="fetch"
 fi
 
 # Weird way to get version, but ok.
@@ -70,11 +76,16 @@ UNREALVER="`./configure --version|head -n1|awk '{ print $3 }'`"
 cd .. || fail "Could not cd back"
 
 # Set and export all variables with settings
-export UNREALVER BUILDDIR SCRIPTDIR DOCDIR TMPDIR
+export UNREALVER BUILDDIR SCRIPTDIR DOCDIR TMPDIR FETCHER
 
 # Download the install script
-wget -O unrealircd-upgrade-script.stage2 "https://www.unrealircd.org/downloads/unrealircd-upgrade-script.stage2?from=$UNREALVER" || fail "Could not download online installer"
-wget -O unrealircd-upgrade-script.stage2.asc "https://www.unrealircd.org/downloads/unrealircd-upgrade-script.stage2.asc" || fail "Could not download online installer signature"
+if [ "$FETCHER" = "wget" ]; then
+	wget -O unrealircd-upgrade-script.stage2 "https://www.unrealircd.org/downloads/unrealircd-upgrade-script.stage2?from=$UNREALVER" || fail "Could not download online installer"
+	wget -O unrealircd-upgrade-script.stage2.asc "https://www.unrealircd.org/downloads/unrealircd-upgrade-script.stage2.asc" || fail "Could not download online installer signature"
+else
+	fetch -o unrealircd-upgrade-script.stage2 "https://www.unrealircd.org/downloads/unrealircd-upgrade-script.stage2?from=$UNREALVER" || fail "Could not download online installer"
+	fetch -o unrealircd-upgrade-script.stage2.asc "https://www.unrealircd.org/downloads/unrealircd-upgrade-script.stage2.asc" || fail "Could not download online installer signature"
+fi
 
 # GPG verification - if available
 if gpg --version 1>/dev/null 2>&1; then
@@ -94,7 +105,11 @@ if gpg --version 1>/dev/null 2>&1; then
 	fi
 else
 	echo "WARNING: The GnuPG (GPG/PGP) verification tool 'gpg' is not installed."
-	echo "Consider running 'sudo apt install gpg' or 'yum install gnupg2'"
+	if [[ "$OSTYPE" == "freebsd"* ]] ; then
+		echo "Consider running 'sudo pkg install gnupg'"
+	else
+		echo "Consider running 'sudo apt install gpg' or 'yum install gnupg2'"
+	fi
 	echo "When 'gpg' is installed then the UnrealIRCd upgrade script can"
 	echo "verify the digital signature of the download file."
 	warn "Unable to check download integrity"
@@ -103,3 +118,6 @@ fi
 
 chmod +x unrealircd-upgrade-script.stage2
 ./unrealircd-upgrade-script.stage2 $*
+SAVERET="$?"
+rm -f unrealircd-upgrade-script.stage2 unrealircd-upgrade-script.stage2
+exit $SAVERET
diff --git a/include/channel.h b/include/channel.h
@@ -26,7 +26,7 @@
 
 #define	MODEBUFLEN	200
 
-#define ChannelExists(n)	(find_channel(n, NULL))
+#define ChannelExists(n)	(find_channel(n))
 
 /* NOTE: Timestamps will be added to MODE-commands, so never make
  * RESYNCMODES and MODEPARAMS higher than MAXPARA-3. DALnet servers
diff --git a/include/common.h b/include/common.h
@@ -98,7 +98,6 @@ extern int myncmp(const char *, const char *, int);
 extern char *strtoken(char **, char *, char *);
 
 extern MODVAR int  global_count, max_global_count;
-extern char *myctime(time_t);
 #ifdef _WIN32
 extern int gettimeofday(struct timeval *tp, void *tzp);
 #endif
@@ -174,18 +173,7 @@ extern MODVAR unsigned char char_atribs[];
 #define EXPAR2	extchmstr[1]
 #define EXPAR3	extchmstr[2]
 #define EXPAR4	extchmstr[3]
-
-#ifdef PREFIX_AQ
-#define CHPFIX        "(qaohv)~&@%+"
-#define CHPAR1        "beI"
-#else
-#define CHPFIX        "(ohv)@%+"
-#define CHPAR1        "beIqa"
-#endif /* PREFIX_AQ */
-
-#define CHPAR2        "k"
-#define CHPAR3        "l"
-#define CHPAR4        "psmntir"
+#define CHPAR1  "beI"
 
 #ifdef _WIN32
 /*
diff --git a/include/config.h b/include/config.h
@@ -98,9 +98,6 @@
  */
 /* #undef	DEBUGMODE */
 
-/* Similarly, DEBUG_IOENGINE can be used to debug the I/O engine. */
-/* #undef	DEBUG_IOENGINE */
-
 /*
  * Full pathnames and defaults of irc system's support files.
  */
@@ -126,7 +123,7 @@
  * Common usage for this are: a trusted bot ran by an IRCOp, that you only
  * want to give "flood access" and nothing else, and other such things.
  */
-#define FAKELAG_CONFIGURABLE
+//#undef FAKELAG_CONFIGURABLE
 
 /* The default value for class::sendq */
 #define DEFAULT_SENDQ	3000000
@@ -212,10 +209,25 @@
  * when there is no socket data waiting for us (no clients sending anything).
  * Was 2000ms in 3.2.x, 1000ms for versions below 3.4-alpha4.
  * 500ms in UnrealIRCd 4 (?)
- * 250ms in UnrealIRCd 5.
+ * 250ms in UnrealIRCd 5 and UnrealIRCd 6.
  */
 #define SOCKETLOOP_MAX_DELAY 250
 
+/* After how much time should we timeout downloads:
+ * DOWNLOAD_CONNECT_TIMEOUT: for the DNS and connect() / TLS_connect() call
+ * DOWNLOAD_TRANSFER_TIMEOUT: for the complete transfer (including connect)
+ * This can't be in the configuration file, as we need it while
+ * fetching the configuration file.. ;)
+ */
+#define DOWNLOAD_CONNECT_TIMEOUT 15
+#define DOWNLOAD_TRANSFER_TIMEOUT 45
+
+/* Maximum number of HTTP redirects to follow.
+ * Keep this reasonably low, as this may delay booting up to
+ * DOWNLOAD_TRANSFER_TIMEOUT * DOWNLOAD_MAX_REDIRECTS
+ */
+#define DOWNLOAD_MAX_REDIRECTS 2
+
 /*
  * Max time from the nickname change that still causes KILL
  * automaticly to switch for the current nick of that user. (seconds)
@@ -233,25 +245,34 @@
 #endif
 
 /* Maximum number of ModData objects that may be attached to an object */
-/* UnrealIRCd 4.0.0 - 4.0.13:  8,    8, 4, 4
- * UnrealIRCd 4.0.14+       : 12,    8, 4, 4
- * UnrealIRCd 5.0.0         : 12, 8, 8, 4, 4, 500, 500
+/* UnrealIRCd 4.0.0 - 4.0.13:  8,     8, 4, 4
+ * UnrealIRCd 4.0.14+       : 12,     8, 4, 4
+ * UnrealIRCd 5.0.0         : 12,  8, 8, 4, 4, 500, 500
+ * UnrealIRCd 6.0.0         : 24, 12, 8, 4, 4, 500, 500
  */
-#define MODDATA_MAX_CLIENT		 12
-#define MODDATA_MAX_LOCAL_CLIENT	  8
+#define MODDATA_MAX_CLIENT		 24
+#define MODDATA_MAX_LOCAL_CLIENT	 12
 #define MODDATA_MAX_CHANNEL		  8
 #define MODDATA_MAX_MEMBER		  4
 #define MODDATA_MAX_MEMBERSHIP		  4
 #define MODDATA_MAX_LOCAL_VARIABLE	500
 #define MODDATA_MAX_GLOBAL_VARIABLE	500
 
+/** Size of the member modes buffer, so can be max this-1 modes
+ * assigned to an individual user (and thus max prefixes as well).
+ * The default is 8, so 7 max modes, and is a bit tight.
+ * It allows for vhoaq (5) and then 2 additional ones from 3rd
+ * party modules.
+ */
+#define MEMBERMODESLEN	8
+
 /* If EXPERIMENTAL is #define'd then all users will receive a notice about
  * this when they connect, along with a pointer to bugs.unrealircd.org where
  * they can report any problems. This is mainly to help UnrealIRCd development.
  */
 #undef EXPERIMENTAL
 
-/* Default SSL/TLS cipherlist (except for TLS1.3, see further down).
+/* Default TLS cipherlist (except for TLS1.3, see further down).
  * This can be changed via set::ssl::options::ciphers in the config file.
  */
 #define UNREALIRCD_DEFAULT_CIPHERS "TLS13-CHACHA20-POLY1305-SHA256 TLS13-AES-256-GCM-SHA384 TLS13-AES-128-GCM-SHA256 EECDH+CHACHA20 EECDH+AESGCM EECDH+AES AES256-GCM-SHA384 AES128-GCM-SHA256 AES256-SHA256 AES128-SHA256 AES256-SHA AES128-SHA"
@@ -261,7 +282,7 @@
  */
 #define UNREALIRCD_DEFAULT_CIPHERSUITES "TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_8_SHA256:TLS_AES_128_CCM_SHA256"
 
-/* Default SSL/TLS curves for ECDH(E)
+/* Default TLS curves for ECDH(E)
  * This can be changed via set::ssl::options::ecdh-curve in the config file.
  * NOTE: This requires openssl 1.0.2 or newer, otherwise these defaults
  *       are not applied, due to the missing openssl API call.
@@ -280,10 +301,8 @@
 #define	IRCD_PIDFILE PIDFILE
 
 #ifdef DEBUGMODE
- #define Debug(x) debug x
  #define LOGFILE LPATH
 #else
- #define Debug(x) ;
  #define LOGFILE "/dev/null"
 #endif
 
diff --git a/include/dbuf.h b/include/dbuf.h
@@ -70,7 +70,7 @@ typedef struct dbufbuf {
 **	memory as needed. Bytes are copied into internal buffers
 **	from users buffer.
 */
-void dbuf_put(dbuf *, char *, size_t);
+void dbuf_put(dbuf *, const char *, size_t);
 					/* Dynamic buffer header */
 					/* Pointer to data to be stored */
 					/* Number of bytes to store */
diff --git a/include/dynconf.h b/include/dynconf.h
@@ -32,26 +32,12 @@ struct FloodSettings {
 	long period[MAXFLOODOPTIONS];
 };
 
-typedef struct NetworkConfiguration NetworkConfiguration;
-struct NetworkConfiguration {
-	unsigned x_inah:1;
-	char *x_ircnetwork;
-	char *x_ircnet005;
-	char *x_defserv;
-	char *x_services_name;
-	char *x_hidden_host;
-	char *x_prefix_quit;
-	char *x_helpchan;
-	char *x_stats_server;
-	char *x_sasl_server;
-};
-
 enum UHAllowed { UHALLOW_ALWAYS, UHALLOW_NOCHANS, UHALLOW_REJOIN, UHALLOW_NEVER };
 
 struct ChMode {
-        long mode;
+	long mode;
 	long extmodes;
-	char *extparams[EXTCMODETABLESZ];
+	char *extparams[256];
 };
 
 typedef struct OperStat {
@@ -70,10 +56,9 @@ typedef enum HideIdleTimePolicy { HIDE_IDLE_TIME_NEVER=1, HIDE_IDLE_TIME_ALWAYS=
 /** The set { } block configuration */
 typedef struct Configuration Configuration;
 struct Configuration {
-	unsigned som:1;
+	unsigned show_opermotd:1;
 	unsigned hide_ulines:1;
 	unsigned flat_map:1;
-	unsigned allow_chatops:1;
 	unsigned ident_check:1;
 	unsigned fail_oper_warn:1;
 	unsigned show_connect_info:1;
@@ -86,8 +71,6 @@ struct Configuration {
 	unsigned allow_part_if_shunned:1;
 	unsigned disable_cap:1;
 	unsigned check_target_nick_bans:1;
-	unsigned use_egd : 1;
-	char *dns_bindip;
 	char *link_bindip;
 	long throttle_period;
 	char throttle_count;
@@ -100,11 +83,10 @@ struct Configuration {
 	char *oper_auto_join_chans;
 	char *allow_user_stats;
 	OperStat *allow_user_stats_ext;
-	int  ping_warning;
-	int  maxchannelsperuser;
-	int  maxdccallow;
-	int  anti_spam_quit_message_time;
-	char *egd_path;
+	int ping_warning;
+	int maxchannelsperuser;
+	int maxdccallow;
+	int anti_spam_quit_message_time;
 	char *static_quit;
 	char *static_part;
 	TLSOptions *tls_options;
@@ -122,12 +104,14 @@ struct Configuration {
 	char *restrict_usermodes;
 	char *restrict_channelmodes;
 	char *restrict_extendedbans;
+	int named_extended_bans;
 	char *channel_command_prefix;
 	long handshake_data_flood_amount;
 	long handshake_data_flood_ban_time;
 	int handshake_data_flood_ban_action;
 	struct ChMode modes_on_join;
-	int level_on_join;
+	int modes_on_join_set;
+	char *level_on_join;
 	FloodSettings *floodsettings;
 	int ident_connect_timeout;
 	int ident_read_timeout;
@@ -148,7 +132,6 @@ struct Configuration {
 	int maxbanlength;
 	int watch_away_notification;
 	int uhnames;
-	NetworkConfiguration network;
 	unsigned short default_ipv6_clone_mask;
 	int ping_cookie;
 	int min_nick_length;
@@ -176,6 +159,17 @@ struct Configuration {
 	BroadcastChannelMessagesOption broadcast_channel_messages;
 	AllowedChannelChars allowed_channelchars;
 	HideIdleTimePolicy hide_idle_time;
+	unsigned inah:1;
+	char *network_name;
+	char *network_name_005;
+	char *default_server;
+	char *services_name;
+	char *cloak_prefix;
+	char *prefix_quit;
+	char *helpchan;
+	char *stats_server;
+	char *sasl_server;
+	int server_notice_colors;
 };
 
 extern MODVAR Configuration iConf;
@@ -187,7 +181,7 @@ extern MODVAR int ipv6_disabled;
 #define CONN_MODES			iConf.conn_modes
 #define OPER_MODES			iConf.oper_modes
 #define OPER_SNOMASK			iConf.oper_snomask
-#define SHOWOPERMOTD			iConf.som
+#define SHOWOPERMOTD			iConf.show_opermotd
 #define HIDE_ULINES			iConf.hide_ulines
 #define FLAT_MAP			iConf.flat_map
 #define ALLOW_CHATOPS			iConf.allow_chatops
@@ -197,7 +191,6 @@ extern MODVAR int ipv6_disabled;
 #define DONT_RESOLVE			iConf.dont_resolve
 #define AUTO_JOIN_CHANS			iConf.auto_join_chans
 #define OPER_AUTO_JOIN_CHANS		iConf.oper_auto_join_chans
-#define DNS_BINDIP			iConf.dns_bindip
 #define LINK_BINDIP			iConf.link_bindip
 #define IDENT_CHECK			iConf.ident_check
 #define FAILOPER_WARN			iConf.fail_oper_warn
@@ -205,23 +198,17 @@ extern MODVAR int ipv6_disabled;
 #define NOCONNECTTLSLINFO		iConf.no_connect_tls_info
 #define ALLOW_USER_STATS			iConf.allow_user_stats
 #define ANTI_SPAM_QUIT_MSG_TIME		iConf.anti_spam_quit_message_time
-#ifdef HAVE_RAND_EGD
-#define USE_EGD				iConf.use_egd
-#else
-#define USE_EGD				0
-#endif
-#define EGD_PATH			iConf.egd_path
 
-#define ircnetwork			iConf.network.x_ircnetwork
-#define ircnet005			iConf.network.x_ircnet005
-#define defserv				iConf.network.x_defserv
-#define SERVICES_NAME		iConf.network.x_services_name
-#define hidden_host			iConf.network.x_hidden_host
-#define helpchan			iConf.network.x_helpchan
-#define STATS_SERVER			iConf.network.x_stats_server
-#define SASL_SERVER			iConf.network.x_sasl_server
-#define iNAH				iConf.network.x_inah
-#define PREFIX_QUIT			iConf.network.x_prefix_quit
+#define NETWORK_NAME			iConf.network_name
+#define NETWORK_NAME_005		iConf.network_name_005
+#define DEFAULT_SERVER			iConf.default_server
+#define SERVICES_NAME			iConf.services_name
+#define CLOAK_PREFIX			iConf.cloak_prefix
+#define HELP_CHANNEL			iConf.helpchan
+#define STATS_SERVER			iConf.stats_server
+#define SASL_SERVER			iConf.sasl_server
+#define iNAH				iConf.inah
+#define PREFIX_QUIT			iConf.prefix_quit
 
 #define STATIC_QUIT			iConf.static_quit
 #define STATIC_PART			iConf.static_part
@@ -232,7 +219,7 @@ extern MODVAR int ipv6_disabled;
 #define THROTTLING_PERIOD		iConf.throttle_period
 #define THROTTLING_COUNT		iConf.throttle_count
 #define USE_BAN_VERSION			iConf.use_ban_version
-#define MODES_ON_JOIN			iConf.modes_on_join.mode
+#define MODES_ON_JOIN			iConf.modes_on_join.extmodes
 #define LEVEL_ON_JOIN			iConf.level_on_join
 
 #define IDENT_CONNECT_TIMEOUT	iConf.ident_connect_timeout
@@ -309,7 +296,6 @@ struct SetCheck {
 	unsigned has_maxchannelsperuser:1;
 	unsigned has_maxdccallow:1;
 	unsigned has_anti_spam_quit_message_time:1;
-	unsigned has_egd_path:1;
 	unsigned has_static_quit:1;
 	unsigned has_static_part:1;
 	unsigned has_allow_userhost_change:1;
diff --git a/include/fdlist.h b/include/fdlist.h
@@ -7,6 +7,8 @@
 
 typedef void (*IOCallbackFunc)(int fd, int revents, void *data);
 
+typedef enum FDCloseMethod { FDCLOSE_SOCKET=0, FDCLOSE_FILE=1, FDCLOSE_NONE=3 } FDCloseMethod;
+
 typedef struct fd_entry {
 	int fd;
 	char desc[FD_DESC_SZ];
@@ -15,14 +17,14 @@ typedef struct fd_entry {
 	void *data;
 	time_t deadline;
 	unsigned char is_open;
+	FDCloseMethod close_method;
 	unsigned int backend_flags;
 } FDEntry;
 
 extern MODVAR FDEntry fd_table[MAXCONNECTIONS + 1];
 
-extern int fd_open(int fd, const char *desc);
-extern void fd_close(int fd);
-extern int fd_unmap(int fd);
+extern int fd_open(int fd, const char *desc, FDCloseMethod close_method);
+extern int fd_close(int fd);
 extern void fd_unnotify(int fd);
 extern int fd_socket(int family, int type, int protocol, const char *desc);
 extern int fd_accept(int sockfd);
diff --git a/include/h.h b/include/h.h
@@ -30,10 +30,6 @@
 
 extern MODVAR char *extraflags;
 extern MODVAR int tainted;
-/* for the new s_err.c */
-extern char *getreply(int);
-#define rpl_str(x) getreply(x)
-#define err_str(x) getreply(x)
 extern MODVAR Member *freemember;
 extern MODVAR Membership *freemembership;
 extern MODVAR Client me;
@@ -52,7 +48,7 @@ extern MODVAR char umodestring[UMODETABLESZ+1];
 #define get_recvq(x) ((x)->local->class->recvq ? (x)->local->class->recvq : DEFAULT_RECVQ)
 
 /* Configuration preprocessor */
-extern PreprocessorItem parse_preprocessor_item(char *start, char *end, char *filename, int linenumber, ConditionalConfig **cc);
+extern PreprocessorItem parse_preprocessor_item(char *start, char *end, const char *filename, int linenumber, ConditionalConfig **cc);
 extern void preprocessor_cc_duplicate_list(ConditionalConfig *r, ConditionalConfig **out);
 extern void preprocessor_cc_free_level(ConditionalConfig **cc_list, int level);
 extern void preprocessor_cc_free_list(ConditionalConfig *cc);
@@ -76,7 +72,6 @@ extern MODVAR ConfigItem_tld		*conf_tld;
 extern MODVAR ConfigItem_oper		*conf_oper;
 extern MODVAR ConfigItem_listen	*conf_listen;
 extern MODVAR ConfigItem_allow		*conf_allow;
-extern MODVAR ConfigItem_except	*conf_except;
 extern MODVAR ConfigItem_vhost		*conf_vhost;
 extern MODVAR ConfigItem_link		*conf_link;
 extern MODVAR ConfigItem_sni		*conf_sni;
@@ -85,9 +80,7 @@ extern MODVAR ConfigItem_deny_channel  *conf_deny_channel;
 extern MODVAR ConfigItem_deny_link	*conf_deny_link;
 extern MODVAR ConfigItem_allow_channel *conf_allow_channel;
 extern MODVAR ConfigItem_deny_version	*conf_deny_version;
-extern MODVAR ConfigItem_log		*conf_log;
 extern MODVAR ConfigItem_alias		*conf_alias;
-extern MODVAR ConfigItem_include	*conf_include;
 extern MODVAR ConfigItem_help		*conf_help;
 extern MODVAR ConfigItem_offchans	*conf_offchans;
 extern MODVAR SecurityGroup		*securitygroups;
@@ -97,10 +90,13 @@ extern EVENT(e_unload_module_delayed);
 extern EVENT(throttling_check_expire);
 
 extern void  module_loadall(void);
-extern long set_usermode(char *umode);
-extern char *get_usermode_string_raw(long umodes);
-extern ConfigFile *config_parse(char *filename, char *confdata);
-extern ConfigFile *config_parse_with_offset(char *filename, char *confdata, unsigned int line_offset);
+extern long set_usermode(const char *umode);
+extern const char *get_usermode_string(Client *acptr);
+extern const char *get_usermode_string_r(Client *client, char *buf, size_t buflen);
+extern const char *get_usermode_string_raw(long umodes);
+extern const char *get_usermode_string_raw_r(long umodes, char *buf, size_t buflen);
+extern ConfigFile *config_parse(const char *filename, char *confdata);
+extern ConfigFile *config_parse_with_offset(const char *filename, char *confdata, unsigned int line_offset);
 extern void config_error(FORMAT_STRING(const char *format), ...) __attribute__((format(printf,1,2)));
 extern void config_warn(FORMAT_STRING(const char *format), ...) __attribute__((format(printf,1,2)));
 extern void config_error_missing(const char *filename, int line, const char *entry);
@@ -115,27 +111,25 @@ extern int config_is_blankorempty(ConfigEntry *cep, const char *block);
 extern MODVAR int config_verbose;
 extern void config_entry_free(ConfigEntry *ce);
 extern void config_entry_free_all(ConfigEntry *ce);
-extern ConfigFile *config_load(char *filename, char *displayname);
+extern ConfigFile *config_load(const char *filename, const char *displayname);
 extern void config_free(ConfigFile *cfptr);
-extern void ipport_seperate(char *string, char **ip, char **port);
-extern ConfigItem_class	*find_class(char *name);
-extern ConfigItem_deny_dcc	*find_deny_dcc(char *name);
-extern ConfigItem_oper		*find_oper(char *name);
-extern ConfigItem_operclass	*find_operclass(char *name);
-extern ConfigItem_listen *find_listen(char *ipmask, int port, int ipv6);
-extern ConfigItem_sni *find_sni(char *name);
-extern ConfigItem_ulines	*find_uline(char *host);
-extern ConfigItem_except	*find_except(Client *, short type);
+extern void ipport_seperate(const char *string, char **ip, char **port);
+extern ConfigItem_class	*find_class(const char *name);
+extern ConfigItem_oper		*find_oper(const char *name);
+extern ConfigItem_operclass	*find_operclass(const char *name);
+extern ConfigItem_listen *find_listen(const char *ipmask, int port, int ipv6);
+extern ConfigItem_sni *find_sni(const char *name);
+extern ConfigItem_ulines	*find_uline(const char *host);
 extern ConfigItem_tld		*find_tld(Client *cptr);
-extern ConfigItem_link		*find_link(char *servername, Client *acptr);
-extern ConfigItem_ban 		*find_ban(Client *, char *host, short type);
-extern ConfigItem_ban 		*find_banEx(Client *,char *host, short type, short type2);
-extern ConfigItem_vhost	*find_vhost(char *name);
-extern ConfigItem_deny_channel *find_channel_allowed(Client *cptr, char *name);
-extern ConfigItem_alias	*find_alias(char *name);
-extern ConfigItem_help 	*find_Help(char *command);
+extern ConfigItem_link		*find_link(const char *servername, Client *acptr);
+extern ConfigItem_ban 		*find_ban(Client *, const char *host, short type);
+extern ConfigItem_ban 		*find_banEx(Client *,const char *host, short type, short type2);
+extern ConfigItem_vhost	*find_vhost(const char *name);
+extern ConfigItem_deny_channel *find_channel_allowed(Client *cptr, const char *name);
+extern ConfigItem_alias	*find_alias(const char *name);
+extern ConfigItem_help 	*find_Help(const char *command);
 
-extern OperPermission ValidatePermissionsForPath(char *path, Client *client, Client *victim, Channel *channel, void *extra);
+extern OperPermission ValidatePermissionsForPath(const char *path, Client *client, Client *victim, Channel *channel, const void *extra);
 extern void OperClassValidatorDel(OperClassValidator *validator);
 
 extern ConfigItem_ban  *find_ban_ip(Client *client);
@@ -144,8 +138,8 @@ extern void append_ListItem(ListStruct *item, ListStruct **list);
 extern void add_ListItemPrio(ListStructPrio *, ListStructPrio **, int);
 extern void del_ListItem(ListStruct *, ListStruct **);
 extern MODVAR LoopStruct loop;
-extern int del_banid(Channel *channel, char *banid);
-extern int del_exbanid(Channel *channel, char *banid);
+extern int del_banid(Channel *channel, const char *banid);
+extern int del_exbanid(Channel *channel, const char *banid);
 #define REPORT_DO_DNS	"NOTICE * :*** Looking up your hostname...\r\n"
 #define REPORT_FIN_DNS	"NOTICE * :*** Found your hostname\r\n"
 #define REPORT_FIN_DNSC "NOTICE * :*** Found your hostname (cached)\r\n"
@@ -161,48 +155,66 @@ extern MODVAR struct list_head oper_list;
 extern MODVAR struct list_head unknown_list;
 extern MODVAR struct list_head global_server_list;
 extern MODVAR struct list_head dead_list;
-extern RealCommand *find_command(char *cmd, int flags);
-extern RealCommand *find_command_simple(char *cmd);
+extern RealCommand *find_command(const char *cmd, int flags);
+extern RealCommand *find_command_simple(const char *cmd);
 extern Membership *find_membership_link(Membership *lp, Channel *ptr);
 extern Member *find_member_link(Member *, Client *);
-extern int remove_user_from_channel(Client *, Channel *);
+extern int remove_user_from_channel(Client *client, Channel *channel, int dont_log);
 extern void add_server_to_table(Client *);
 extern void remove_server_from_table(Client *);
-extern void iNAH_host(Client *client, char *host);
-extern void set_snomask(Client *client, char *snomask);
-extern char *get_snomask_string(Client *client);
+extern void iNAH_host(Client *client, const char *host);
+extern void set_snomask(Client *client, const char *snomask);
 extern int check_tkls(Client *cptr);
 /* for services */
 extern void send_user_joins(Client *, Client *);
 extern int valid_channelname(const char *);
-extern int valid_server_name(char *name);
-extern long get_access(Client *, Channel *);
-extern int ban_check_mask(Client *, Channel *, char *, int, char **, char **, int);
-extern int extban_is_ok_nuh_extban(Client *, Channel *, char *, int, int, int);
-extern char *extban_conv_param_nuh_or_extban(char *);
-extern char *extban_conv_param_nuh(char *);
-extern Ban *is_banned(Client *, Channel *, int, char **, char **);
-extern Ban *is_banned_with_nick(Client *, Channel *, int, char *, char **, char **);
+extern int valid_server_name(const char *name);
+extern Cmode *find_channel_mode_handler(char letter);
+extern int valid_channel_access_mode_letter(char letter);
+extern int check_channel_access(Client *client, Channel *channel, const char *modes);
+extern int check_channel_access_membership(Membership *mb, const char *modes);
+extern int check_channel_access_member(Member *mb, const char *modes);
+extern int check_channel_access_string(const char *current_modes, const char *modes);
+extern int check_channel_access_letter(const char *current_modes, const char letter);
+extern const char *get_channel_access(Client *client, Channel *channel);
+extern void add_member_mode_fast(Member *mb, Membership *mbs, char letter);
+extern void del_member_mode_fast(Member *mb, Membership *mbs, char letter);
+extern void add_member_mode(Client *client, Channel *channel, char letter);
+extern void del_member_mode(Client *client, Channel *channel, char letter);
+extern char sjoin_prefix_to_mode(char s);
+extern char mode_to_sjoin_prefix(char s);
+extern char mode_to_prefix(char s);
+extern char prefix_to_mode(char s);
+extern const char *modes_to_prefix(const char *modes);
+extern const char *modes_to_sjoin_prefix(const char *modes);
+extern char rank_to_mode(int rank);
+extern int mode_to_rank(char mode);
+extern char lowest_ranking_mode(const char *modes);
+extern char lowest_ranking_prefix(const char *prefix);
+extern void channel_member_modes_generate_equal_or_greater(const char *modes, char *buf, size_t buflen);
+extern int ban_check_mask(BanContext *b);
+extern int extban_is_ok_nuh_extban(BanContext *b);
+extern const char *extban_conv_param_nuh_or_extban(BanContext *b, Extban *extban);
+extern const char *extban_conv_param_nuh(BanContext *b, Extban *extban);
+extern Ban *is_banned(Client *, Channel *, int, const char **, const char **);
+extern Ban *is_banned_with_nick(Client *, Channel *, int, const char *, const char **, const char **);
 
-extern void ircd_log(int, FORMAT_STRING(const char *), ...) __attribute__((format(printf,2,3)));
-extern Client *find_client(char *, Client *);
-extern Client *find_name(char *, Client *);
-extern Client *find_nickserv(char *, Client *);
-extern Client *find_person(char *, Client *);
-extern Client *find_server(char *, Client *);
-extern Client *find_service(char *, Client *);
+extern Client *find_client(const char *, Client *);
+extern Client *find_name(const char *, Client *);
+extern Client *find_nickserv(const char *, Client *);
+extern Client *find_user(const char *, Client *);
+extern Client *find_server(const char *, Client *);
+extern Client *find_service(const char *, Client *);
 #define find_server_quick(x) find_server(x, NULL)
 extern char *find_or_add(char *);
 extern void inittoken();
 extern void reset_help();
 
 extern MODVAR char *debugmode, *configfile, *sbrk0;
-extern char *getfield(char *);
-extern void set_sockhost(Client *, char *);
+extern void set_sockhost(Client *, const char *);
 #ifdef _WIN32
-extern MODFUNC char *sock_strerror(int);
+extern const char *sock_strerror(int);
 #endif
-extern int dgets(int, char *, int);
 
 #ifdef _WIN32
 extern MODVAR int debuglevel;
@@ -213,86 +225,111 @@ extern MODVAR int OpenFiles;  /* number of files currently open */
 extern MODVAR int debuglevel, portnum, debugtty, maxusersperchannel;
 extern MODVAR int readcalls, udpfd, resfd;
 extern Client *add_connection(ConfigItem_listen *, int);
-extern void add_local_domain(char *, int);
 extern int check_server_init(Client *);
 extern void close_connection(Client *);
 extern void close_unbound_listeners();
-extern int connect_server(ConfigItem_link *, Client *, struct hostent *);
-extern void get_my_name(Client *, char *, int);
 extern int get_sockerr(Client *);
 extern int inetport(ConfigItem_listen *, char *, int, int);
 extern void init_sys();
 extern void check_user_limit(void);
 extern void init_modef();
-extern int verify_hostname(char *name);
+extern int verify_hostname(const char *name);
 
-extern void report_error(char *, Client *);
 extern int setup_ping();
 
 extern void set_channel_mlock(Client *, Channel *, const char *, int);
 
-extern void restart(char *);
-extern void server_reboot(char *);
+extern void restart(const char *);
+extern void server_reboot(const char *);
 extern void terminate(), write_pidfile();
 extern void *safe_alloc(size_t size);
 extern void set_socket_buffers(int fd, int rcvbuf, int sndbuf);
 extern int send_queued(Client *);
 extern void send_queued_cb(int fd, int revents, void *data);
-extern void sendto_connectnotice(Client *client, int disconnect, char *comment);
-extern void sendto_serv_butone_nickcmd(Client *one, Client *client, char *umodes);
-extern void    sendto_message_one(Client *to, Client *from, char *sender,
-    char *cmd, char *nick, char *msg);
-#define PREFIX_ALL		0
-#define PREFIX_HALFOP	0x1
-#define PREFIX_VOICE	0x2
-#define PREFIX_OP	0x4
-#define PREFIX_ADMIN	0x08
-#define PREFIX_OWNER	0x10
+extern void sendto_serv_butone_nickcmd(Client *one, MessageTag *mtags, Client *client, const char *umodes);
+extern void    sendto_message_one(Client *to, Client *from, const char *sender, const char *cmd, const char *nick, const char *msg);
 extern void sendto_channel(Channel *channel, Client *from, Client *skip,
-                           int prefix, long clicap, int sendflags,
+                           char *member_modes, long clicap, int sendflags,
                            MessageTag *mtags,
                            FORMAT_STRING(const char *pattern), ...) __attribute__((format(printf,8,9)));
 extern void sendto_local_common_channels(Client *user, Client *skip,
                                          long clicap, MessageTag *mtags,
                                          FORMAT_STRING(const char *pattern), ...) __attribute__((format(printf,5,6)));
 extern void sendto_match_servs(Channel *, Client *, FORMAT_STRING(const char *), ...) __attribute__((format(printf,3,4)));
-extern void sendto_match_butone(Client *, Client *, char *, int, MessageTag *,
+extern void sendto_match_butone(Client *, Client *, const char *, int, MessageTag *,
     FORMAT_STRING(const char *pattern), ...) __attribute__((format(printf,6,7)));
 extern void sendto_all_butone(Client *, Client *, FORMAT_STRING(const char *), ...) __attribute__((format(printf,3,4)));
 extern void sendto_ops(FORMAT_STRING(const char *), ...) __attribute__((format(printf,1,2)));
-extern void sendto_ops_butone(Client *, Client *, FORMAT_STRING(const char *), ...) __attribute__((format(printf,3,4)));
 extern void sendto_prefix_one(Client *, Client *, MessageTag *, FORMAT_STRING(const char *), ...) __attribute__((format(printf,4,5)));
+extern void vsendto_prefix_one(Client *to, Client *from, MessageTag *mtags, const char *pattern, va_list vl);
 extern void sendto_opers(FORMAT_STRING(const char *), ...) __attribute__((format(printf,1,2)));
 extern void sendto_umode(int, FORMAT_STRING(const char *), ...) __attribute__((format(printf,2,3)));
 extern void sendto_umode_global(int, FORMAT_STRING(const char *), ...) __attribute__((format(printf,2,3)));
-extern void sendto_snomask(int