Skip to content
Snippets Groups Projects
Commit d167733c authored by Michael Long's avatar Michael Long
Browse files

updates from feedback, add unzip ability (linux)

parent 16afae62
No related branches found
No related tags found
2 merge requests!463MRC mods by Codefenix (2024-10-20),!19add tqwnet to init tickit
Pipeline #445 passed
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
; name = Name of the network, usually the same as the 5D domain, <= 8 chars ; name = Name of the network, usually the same as the 5D domain, <= 8 chars
; desc = Short description of the network ; desc = Short description of the network
; info = URL to information about the network ; info = URL to information about the network
; pack = URL to info pack file
; coord = Name of the zone/network coordinator ; coord = Name of the zone/network coordinator
; email = Internet email address of the zone/network coordinator ; email = Internet email address of the zone/network coordinator
; fido = FidoNet address of the zone/network coordinator (for NetMail) ; fido = FidoNet address of the zone/network coordinator (for NetMail)
...@@ -47,10 +48,23 @@ desc = Australasia ...@@ -47,10 +48,23 @@ desc = Australasia
name = FidoNet name = FidoNet
desc = Latin America (except Puerto Rico) desc = Latin America (except Puerto Rico)
[zone:11]
name = WWIVnet
desc = WWIVnet
info = https://www.wwivbbs.org/docs/network/wwivnet.html
coord = Mark Hofmann
email = mark@weather-station.org
addr = 11:1/100
host = bbs.weather-station.org
port = 24555
echolist = https://raw.githubusercontent.com/wwivbbs/wwivnet/master/wwivnet/wwivnet.na
areatag_prefix = WWIV_
[zone:21] [zone:21]
name = fsxNet name = fsxNet
desc = Fun, Simple and eXperimental network desc = Fun, Simple and eXperimental network
info = http://fsxnet.nz/ info = http://fsxnet.nz/
pack = https://github.com/fsxnet/infopack/archive/master.zip
coord = Paul Hayton coord = Paul Hayton
email = avon@bbs.nz email = avon@bbs.nz
addr = 21:1/100 addr = 21:1/100
...@@ -76,19 +90,20 @@ areatitle_prefix = AmigaNet: ...@@ -76,19 +90,20 @@ areatitle_prefix = AmigaNet:
[zone:40] [zone:40]
name = CyberNet name = CyberNet
desc = Stock, Trading, Cybersecurity, OS, Technology, Hacking, Crypto desc = Stock, Trading, Cybersecurity, OS, Technology, Hacking, Crypto
info = http://www.thebytexchange.com/cybernet/ info = telnet://bbs.thebytexchange.com:23
coord = Chad Adams coord = Chad Adams
email = nugax@thebytexchange.com email = nugax@thebytexchange.com
addr = 40:1/1@cybernet addr = 40:1/1@cybernet
fido = 1:19/37 fido = 1:19/37
host = hub.cybernetbbs.net host = hub.cybernetbbs.net
echolist = http://thebytexchange.com/cybernet/cybernet.na echolist =
areatag_prefix = CN_ areatag_prefix = CN_
[zone:44] [zone:44]
name = DoRENET name = DoRENET
desc = BBS modifications, coding, ansi/asci etc desc = BBS modifications, coding, ansi/asci etc
info = https://www.dreamlandbbs.org/dorenet/ info = https://www.dreamlandbbs.org/dorenet/
pack = https://www.dreamlandbbs.org/wp-content/uploads/2020/04/dorenet.zip
coord = Dream Master coord = Dream Master
addr = 44:100/0 addr = 44:100/0
fido = 1:218/530 fido = 1:218/530
...@@ -101,7 +116,8 @@ areatag_exclude = netmail ...@@ -101,7 +116,8 @@ areatag_exclude = netmail
[zone:46] [zone:46]
name = Agoranet name = Agoranet
desc = The Official Network of ACiD Productions desc = The Official Network of ACiD Productions
info = ftp://pharcyde.org/agoranet/AGN_INFO/agoranet.zip info =
pack = ftp://pharcyde.org/agoranet/AGN_INFO/agoranet.zip
coord = Nicholas Boel coord = Nicholas Boel
email = accessd@pharcyde.org email = accessd@pharcyde.org
addr = 46:1/100 addr = 46:1/100
...@@ -129,6 +145,7 @@ areatag_prefix = CNT_ ...@@ -129,6 +145,7 @@ areatag_prefix = CNT_
name = SciNet name = SciNet
desc = Active network for the BBS scene desc = Active network for the BBS scene
info = https://scinet-ftn.org/ info = https://scinet-ftn.org/
pack = https://scinet-ftn.org/sciinfo.zip
coord = Frank Linhares coord = Frank Linhares
email = scinet@diskshop.ca email = scinet@diskshop.ca
addr = 77:1/100 addr = 77:1/100
...@@ -138,22 +155,61 @@ echolist = https://scinet-ftn.org/scinet.na ...@@ -138,22 +155,61 @@ echolist = https://scinet-ftn.org/scinet.na
areatag_prefix = areatag_prefix =
areatitle_prefix = SciNet: areatitle_prefix = SciNet:
[zone:256]
name = DevNet
desc = developer oriented network
info = http://www.digitaldistortionbbs.com, Also available as QWK. See pack.
pack = ftp://digitaldistortionbbs.com/bbs/INFOPAKS/DevNet.zip
coord = Tony Langdon
email = vk3jed@vkradio.com
addr = 256:8/100
host = bridge.vkradio.com
echolist = devnet.na
areatag_prefix = DEV_
[zone:432] [zone:432]
name = VKRadio name = VKRadio
desc = hobbyist radio communication oriented network desc = hobbyist radio communication oriented network
info = https://vkradio.com/vkradio.zip info = https://vkradio.com/vkradio.zip
pack = https://vkradio.com/vkradio.zip
coord = Tony Langdon coord = Tony Langdon
email = vk3jed@vkradio.com email = vk3jed@vkradio.com
addr = 432:1/100 addr = 432:1/100
fido = 3:633/410 fido = 3:633/410
dns = ftn.vkradio.com dns = ftn.vkradio.com
host = bridge.vkradio.com
echolist = https://vkradio.com/vkradio.na echolist = https://vkradio.com/vkradio.na
areatag_prefix = VK_ areatag_prefix = VK_
[zone:440]
name = MusicNet
desc = music oriented network
info = http://www.digitaldistortionbbs.com, Also available as QWK. See pack.
pack = ftp://digitaldistortionbbs.com/bbs/INFOPAKS/MusicNet.zip
coord = Tony Langdon
email = vk3jed@vkradio.com
addr = 440:1/100
host = bridge.vkradio.com
echolist = musicnet.na
areatag_prefix = MUS_
[zone:316]
name = Whisper
desc = Family-Oriented Bulletin Board Message/File Network
info = http://www.cr1mson.org/whispernet.html
pack = http://www.cr1mson.org/uploads/1/4/5/3/14535704/whispnet.zip
coord = Jon Justvig
email = jonathanjustvig@gmail.com
addr = 316:36/1
host = vintagebbsing.com
echolist = wenmbone.na
areatag_prefix = WHISP_
[zone:618] [zone:618]
name = Micronet name = Micronet
desc = laid-back, friendly and comfortable mail desc = laid-back, friendly and comfortable mail
info = https://minftn.net/ info = https://minftn.net/
pack = http://minftn.net/mininfo.zip
coord = Sean Dennis coord = Sean Dennis
email = zc@minftn.net email = zc@minftn.net
fido = 1:18/200 fido = 1:18/200
...@@ -162,3 +218,15 @@ addr = 618:618/2 ...@@ -162,3 +218,15 @@ addr = 618:618/2
host = phoenix.bnbbbs.net host = phoenix.bnbbbs.net
echolist = micronet.na echolist = micronet.na
areatag_prefix = MIN_ areatag_prefix = MIN_
[zone:1337]
name = tqwNet
desc = A network for having fun and international friendships
info = https://https://www.erb.pw/
pack = https://www.erb.pw/tqwinfo.zip
coord = MeaTLoTioN
email = ml@erb.pw
addr = 1337:3/100
host = hub.ca.erb.pw
echolist = tqwnet.na
areatag_prefix = TQW_
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
"use strict"; "use strict";
const REVISION = "$Revision: 1.29 $".split(' ')[1]; const REVISION = "$Revision: 1.30 $".split(' ')[1];
require('sbbsdefs.js', 'SUB_NAME'); require('sbbsdefs.js', 'SUB_NAME');
var netname; var netname;
var netdns; var netdns;
...@@ -155,6 +155,8 @@ function send_app_netmail(destaddr) ...@@ -155,6 +155,8 @@ function send_app_netmail(destaddr)
body_text += "\r\n"; body_text += "\r\n";
body_text += "My requested AreaFix password is: '" + link.AreaFixPwd + "'\r\n"; body_text += "My requested AreaFix password is: '" + link.AreaFixPwd + "'\r\n";
body_text += "My requested BinkP Session password is: '" + link.SessionPwd + "'\r\n"; body_text += "My requested BinkP Session password is: '" + link.SessionPwd + "'\r\n";
if(link.TicFilePwd)
body_text += "My requested TIC Password is: '" + link.TicFilePwd + "'\r\n";
body_text += "\r\n"; body_text += "\r\n";
body_text += "I will be using 'Type-2+' (FSC-39) packets with no password.\r\n"; body_text += "I will be using 'Type-2+' (FSC-39) packets with no password.\r\n";
body_text += "Uncompressed or PKZIP-archived EchoMail bundles will work fine.\r\n"; body_text += "Uncompressed or PKZIP-archived EchoMail bundles will work fine.\r\n";
...@@ -230,12 +232,56 @@ function lookup_network(info) ...@@ -230,12 +232,56 @@ function lookup_network(info)
return result; return result;
} }
function get_linked_node(addr) function get_domain(zone)
{
var file = new File("sbbsecho.ini");
if(!file.open("r")) {
alert("Error " + file.error + " opening " + file.name);
return false;
}
var domain_list = file.iniGetSections("domain:");
if(domain_list) {
var zonemap = {};
for(var i = 0; i < domain_list.length && !result; i++) {
var section = domain_list[i];
var netname = section.substr(7)
var zones = file.iniGetValue(section, "Zones");
if(!zones)
continue;
if(typeof zones == 'number') {
if(zone == zones) {
return netname;
}
continue;
}
zones = zones.split(',');
for(var j = 0; j < zones.length; j++) {
if(zone == zones[j]) {
return netname;
}
}
}
file.close();
return result;
}
return "";
}
function get_linked_node(addr, domain)
{ {
var file = new File("sbbsecho.ini"); var file = new File("sbbsecho.ini");
if(!file.open("r")) if(!file.open("r"))
return false; return false;
var result = file.iniGetObject("node:" + addr); var result;
if(domain) {
result = file.iniGetObject("node:" + addr + "@" + domain);
if (!result) {
result = file.iniGetObject("node:" + addr);
}
} else {
result = file.iniGetObject("node:" + addr);
}
file.close(); file.close();
return result; return result;
} }
...@@ -250,7 +296,7 @@ function get_binkp_sysop() ...@@ -250,7 +296,7 @@ function get_binkp_sysop()
return result; return result;
} }
function update_sbbsecho_ini(hub, link, echolist_fname, areamgr) function update_sbbsecho_ini(hub, link, domain, echolist_fname, areamgr)
{ {
function makepath(path) function makepath(path)
{ {
...@@ -295,15 +341,36 @@ function update_sbbsecho_ini(hub, link, echolist_fname, areamgr) ...@@ -295,15 +341,36 @@ function update_sbbsecho_ini(hub, link, echolist_fname, areamgr)
if(!binkp) binkp = {}; if(!binkp) binkp = {};
binkp.sysop = sysop; binkp.sysop = sysop;
if(!file.iniSetObject("binkp", binkp)) { if(!file.iniSetObject("binkp", binkp)) {
return "Error" + file.error + " writign to " + file.name; return "Error" + file.error + " writing to " + file.name;
} }
var prefnode;
var section = "node:" + fidoaddr.to_str(hub); var section = "node:" + fidoaddr.to_str(hub);
if(!file.iniGetObject(section)
|| confirm("Overwrite hub [" + section + "] configuration in " + file.name)) { if(domain) {
if(file.iniGetObject(section)) {
if(confirm("Migrate " + section + " to " + section + "@" + domain)) {
if(!file.iniSetObject(section + "@" + domain, link)) {
return "Error " + file.error + " writing to " + file.name;
} else {
file.iniRemoveSection(section);
}
}
} else {
if(!file.iniGetObject(section) || confirm("Overwrite hub [" + section + "@" + domain + "] configuration in " + file.name)) {
if(!file.iniSetObject(section + "@" + domain, link)) {
return "Error " + file.error + " writing to " + file.name;
}
}
}
} else {
if(!file.iniGetObject(section) || confirm("Overwrite hub [" + section + "] configuration in " + file.name)) {
if(!file.iniSetObject(section, link)) { if(!file.iniSetObject(section, link)) {
return "Error " + file.error + " writing to " + file.name; return "Error " + file.error + " writing to " + file.name;
} }
} }
}
var section = "node:" + hub.zone + ":ALL"; var section = "node:" + hub.zone + ":ALL";
if(confirm("Route all zone " + hub.zone + " netmail through your hub")) { if(confirm("Route all zone " + hub.zone + " netmail through your hub")) {
if(!file.iniSetObject(section, if(!file.iniSetObject(section,
...@@ -343,7 +410,6 @@ else if(netname) { ...@@ -343,7 +410,6 @@ else if(netname) {
netzone = lookup_network(netname); netzone = lookup_network(netname);
network = network_list[netzone]; network = network_list[netzone];
} }
if(!netzone) { if(!netzone) {
for(var zone in network_list) { for(var zone in network_list) {
var desc = ""; var desc = "";
...@@ -358,7 +424,8 @@ if(!netzone) { ...@@ -358,7 +424,8 @@ if(!netzone) {
email = " <" + network_list[zone].email + ">"; email = " <" + network_list[zone].email + ">";
if(network_list[zone].fido) if(network_list[zone].fido)
email += " " + network_list[zone].fido; email += " " + network_list[zone].fido;
print(" coordinator: " + (network_list[zone].coord || "") + email); // removed because screen is scrolling so much with so many networks
//print(" coordinator: " + (network_list[zone].coord || "") + email);
} }
} }
var which; var which;
...@@ -377,6 +444,9 @@ if(network) ...@@ -377,6 +444,9 @@ if(network)
else else
network = {}; network = {};
var domain = get_domain(netzone);
if(netzone <= 6) if(netzone <= 6)
netname = "FidoNet"; netname = "FidoNet";
else { else {
...@@ -391,6 +461,10 @@ if(netname) { ...@@ -391,6 +461,10 @@ if(netname) {
print("Network name: " + netname); print("Network name: " + netname);
print("Network zone: " + netzone); print("Network zone: " + netzone);
print("Network info: " + network.info); print("Network info: " + network.info);
print("Network domain: " + domain);
if (network.pack) {
print("Network pack: " + network.pack);
}
print("Network coordinator: " + network.coord print("Network coordinator: " + network.coord
+ (network.email ? (" <" + network.email + ">") : "") + (network.email ? (" <" + network.email + ">") : "")
+ (network.fido ? (" " + network.fido) : "")); + (network.fido ? (" " + network.fido) : ""));
...@@ -432,7 +506,7 @@ while(((isNaN(hub.zone) || hub.zone < 1) ...@@ -432,7 +506,7 @@ while(((isNaN(hub.zone) || hub.zone < 1)
hub = fidoaddr.parse(prompt("Your hub's address (zone:net/node)")); hub = fidoaddr.parse(prompt("Your hub's address (zone:net/node)"));
} }
var link = get_linked_node(fidoaddr.to_str(hub)); var link = get_linked_node(fidoaddr.to_str(hub), domain);
if(!link) if(!link)
link = {}; link = {};
...@@ -477,9 +551,9 @@ while(!confirm("Your node address is " + fidoaddr.to_str(your)) && !aborted()) { ...@@ -477,9 +551,9 @@ while(!confirm("Your node address is " + fidoaddr.to_str(your)) && !aborted()) {
your.net = NaN; your.net = NaN;
your.node = NaN; your.node = NaN;
while((isNaN(your.zone) || your.zone < 1) && !aborted()) while((isNaN(your.zone) || your.zone < 1) && !aborted())
your.zone = parseInt(prompt("Your zone number (e.g. 1 for FidoNet North America)")); your.zone = parseInt(prompt("Your zone number (e.g. " + hub.zone + ")"));
while((isNaN(your.net) || your.net < 1) && !aborted()) while((isNaN(your.net) || your.net < 1) && !aborted())
your.net = parseInt(prompt("Your network number (i.e. normally the same as your hub)")); your.net = parseInt(prompt("Your network number (e.g. " + hub.net + ")"));
while((isNaN(your.node) || your.node < 1) && !aborted()) while((isNaN(your.node) || your.node < 1) && !aborted())
your.node = parseInt(prompt("Your node number (e.g. 9999 for temporary node)")); your.node = parseInt(prompt("Your node number (e.g. 9999 for temporary node)"));
while((isNaN(your.point)) && !aborted()) while((isNaN(your.point)) && !aborted())
...@@ -502,6 +576,8 @@ while((!link.AreaFixPwd || !confirm("Your AreaFix Password is '" + link.AreaFixP ...@@ -502,6 +576,8 @@ while((!link.AreaFixPwd || !confirm("Your AreaFix Password is '" + link.AreaFixP
link.AreaFixPwd = prompt("Your AreaFix (a.k.a. Area Manager) Password (case in-sensitive)"); link.AreaFixPwd = prompt("Your AreaFix (a.k.a. Area Manager) Password (case in-sensitive)");
while((!link.SessionPwd || !confirm("Your BinkP Session Password is '" + link.SessionPwd + "'")) && !aborted()) while((!link.SessionPwd || !confirm("Your BinkP Session Password is '" + link.SessionPwd + "'")) && !aborted())
link.SessionPwd = prompt("Your BinkP Session Password (case sensitive)"); link.SessionPwd = prompt("Your BinkP Session Password (case sensitive)");
while(((!link.TicFilePwd && (link.TicFilePwd !== "")) || !confirm("Your TIC File Password is '" + (link.TicFilePwd ? link.TicFilePwd : "(not set)") + "'")) && !aborted())
link.TicFilePwd = prompt("Your TIC File Password (case sensitive) (optional)");
/***********************************************/ /***********************************************/
/* SEND NODE NUMBER REQUEST NETMAIL (Internet) */ /* SEND NODE NUMBER REQUEST NETMAIL (Internet) */
...@@ -517,7 +593,7 @@ if(your.node === 9999 && network.email && network.email.indexOf('@') > 0 ...@@ -517,7 +593,7 @@ if(your.node === 9999 && network.email && network.email.indexOf('@') > 0
exit(0); exit(0);
if(confirm("Come back when you have your permanently-assigned node address")) { if(confirm("Come back when you have your permanently-assigned node address")) {
if(confirm("Save changes to FidoNet configuration file: sbbsecho.ini")) { if(confirm("Save changes to FidoNet configuration file: sbbsecho.ini")) {
var result = update_sbbsecho_ini(hub, link); var result = update_sbbsecho_ini(hub, link, domain);
if (result != true) { if (result != true) {
alert(result); alert(result);
exit(1); exit(1);
...@@ -564,11 +640,12 @@ if(confirm("Save Changes to Message Area configuration file: msgs.cnf")) { ...@@ -564,11 +640,12 @@ if(confirm("Save Changes to Message Area configuration file: msgs.cnf")) {
/* DOWNLOAD ECHOLIST */ /* DOWNLOAD ECHOLIST */
/*********************/ /*********************/
var echolist_fname = file_getname(network.echolist); var echolist_fname = file_getname(network.echolist);
load("http.js");
if(network.echolist if(network.echolist
&& (network.echolist.indexOf("http://") == 0 || network.echolist.indexOf("https://") == 0) && (network.echolist.indexOf("http://") == 0 || network.echolist.indexOf("https://") == 0)
&& confirm("Download " + netname + " EchoList: " + file_getname(network.echolist))) { && confirm("Download " + netname + " EchoList: " + file_getname(network.echolist))) {
var echolist_url = network.echolist; var echolist_url = network.echolist;
load("http.js");
while(!aborted()) { while(!aborted()) {
while((!echolist_url || !confirm("Download from: " + echolist_url)) && !aborted()) { while((!echolist_url || !confirm("Download from: " + echolist_url)) && !aborted()) {
echolist_url = prompt("Echolist URL"); echolist_url = prompt("Echolist URL");
...@@ -590,7 +667,7 @@ if(network.echolist ...@@ -590,7 +667,7 @@ if(network.echolist
continue; continue;
} }
if(http_request.response_code == 200) { if(http_request.response_code == 200) {
print("Downloaded " + echolist_url + " to " + file.name); print("Downloaded " + echolist_url + " to " + system.ctrl_dir + file.name);
file.write(contents); file.write(contents);
file.close(); file.close();
break; break;
...@@ -601,14 +678,66 @@ if(network.echolist ...@@ -601,14 +678,66 @@ if(network.echolist
if(!confirm("Try again")) if(!confirm("Try again"))
break; break;
} }
} else if (network.pack
&& (network.pack.indexOf("http://") == 0 || network.pack.indexOf("https://") == 0)
&& confirm("Download " + netname + " Info Pack: " + network.pack)) {
while(!aborted()) {
var packdlfilename = file_getname(network.pack)
var file = new File(packdlfilename);
if(!file.open("w")) {
alert("Error " + file.error + " opening " + file.name);
exit(1);
}
var http_request = new HTTPRequest();
try {
var contents = http_request.Get(network.pack);
} catch(e) {
alert(e);
file.close();
file_remove(system.ctrl_dir + file.name);
if(!confirm("Try again"))
break;
continue;
}
if(http_request.response_code == 200) {
print("Downloaded " + network.pack + " to " + system.ctrl_dir + file.name);
file.write(contents);
file.close();
// try to extract on linux,
if (system.platform == 'Linux') {
if (system.exec("unzip -CLo " + file_getname(network.pack) + " " + echolist_fname) !== 0) {
print("Please extract " + network.echolist + " from " + file.name + " into " + system.ctrl_dir);
}
} else if (system.platform == 'Win32') {
print("Please extract " + network.echolist + " from " + file.name + " into " + system.ctrl_dir);
}
break;
}
file.close();
file_remove(file.name);
alert("Error " + http_request.response_code + " downloading " + network.pack);
if(!confirm("Try again"))
break;
}
} }
while(echolist_fname && !file_getcase(echolist_fname) && !aborted()) { while(echolist_fname && !file_getcase(echolist_fname) && !aborted()) {
alert(system.ctrl_dir + echolist_fname + " does not exist"); alert(system.ctrl_dir + echolist_fname + " does not exist");
if(!confirm("Install " + netname + " EchoList: " + echolist_fname)) if ((network.echolist.indexOf("http://") == -1) && (network.echolist.indexOf("https://") == -1)
&& (network.pack)) {
if (!confirm("Please extract the " + echolist_fname + " file from the pack " + file_getname(network.pack) + " into " + system.ctrl_dir + ". Continue?")) {
break; break;
prompt("Download and extract " + echolist_fname + " now... Press enter to continue");
} }
echolist_fname = file_getcase(echolist_fname) } else {
if (!confirm("Please place " + echolist_fname + " into " + system.ctrl_dir + ". Continue?")) {
break;
}
}
prompt(echolist_fname + " not found. Please put file into ctrl dir and press Enter.");
}
echolist_fname = file_getcase(system.ctrl_dir + echolist_fname)
if(echolist_fname && file_size(echolist_fname) > 0) { if(echolist_fname && file_size(echolist_fname) > 0) {
if(network.areatag_exclude) { if(network.areatag_exclude) {
print("Removing " + network.areatag_exclude + " from " + echolist_fname); print("Removing " + network.areatag_exclude + " from " + echolist_fname);
...@@ -640,7 +769,7 @@ if(echolist_fname && file_size(echolist_fname) > 0) { ...@@ -640,7 +769,7 @@ if(echolist_fname && file_size(echolist_fname) > 0) {
/* UPDATE SBBSECHO.INI */ /* UPDATE SBBSECHO.INI */
/***********************/ /***********************/
if(confirm("Save changes to FidoNet configuration file: sbbsecho.ini")) { if(confirm("Save changes to FidoNet configuration file: sbbsecho.ini")) {
var result = update_sbbsecho_ini(hub, link, echolist_fname, network.areamgr); var result = update_sbbsecho_ini(hub, link, domain, echolist_fname, network.areamgr);
if (result != true) { if (result != true) {
alert(result); alert(result);
exit(1); exit(1);
......
  • Kayz @phar

    mentioned in commit 5c535723

    ·

    mentioned in commit 5c535723

    Toggle commit list
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment