diff --git a/lg/willMembers_en.txt b/lg/willMembers_en.txt index 50627c28ea5fb1f62e4d482c137fa56efdddde36..47d0f60971b02dd7ffdae69dddcd133c1911a52f 100755 --- a/lg/willMembers_en.txt +++ b/lg/willMembers_en.txt @@ -42,6 +42,7 @@ MEMBERSHIP_ASKED Membership asked YES yes NO no QUALITY_CERTIFIERS quality certifiers +DISTANCE Distance CERTIFIERS_COUNT certifiers count QUALITY quality SIG_PERIOD_OK available diff --git a/lg/willMembers_fr.txt b/lg/willMembers_fr.txt index 908eed32cd6d584a004921a979b1d2a0832cb8bc..589ccb14926c58e66b690a8386e429ddb250cbac 100755 --- a/lg/willMembers_fr.txt +++ b/lg/willMembers_fr.txt @@ -42,6 +42,7 @@ MEMBERSHIP_ASKED Adhésion demandée YES oui NO non QUALITY_CERTIFIERS qualité certificateurs +DISTANCE Distance CERTIFIERS_COUNT Nombre de certificateurs QUALITY qualité SIG_PERIOD_OK disponible diff --git a/lib/constants.js b/lib/constants.js new file mode 100755 index 0000000000000000000000000000000000000000..9f2a70fe3a6f4964f91aaa268249d394e3894801 --- /dev/null +++ b/lib/constants.js @@ -0,0 +1,10 @@ +"use strict"; + +module.exports = { + USE_WOTB6: false, + MIN_WILLMEMBERS_UPDATE_FREQ: 180, + MIN_MEMBERS_UPDATE_FREQ: 180, + STEP_COUNT_MIN: 4, + STEP_COUNT_MAX: 150, + MIN_CACHE_UPDATE_FREQ: 150 // 2 min 30 (150 sec) +}; \ No newline at end of file diff --git a/lib/updateCache.js b/lib/updateCache.js index 96e2370c2c73c0143a21dc1d80b5774127054b1b..088ec1c2091de232470b03b6fa5d35d75dc1b780 100755 --- a/lib/updateCache.js +++ b/lib/updateCache.js @@ -2,10 +2,7 @@ const co = require('co'); //const sqlite3 = require('sqlite3').verbose(); - -const STEP_COUNT_MIN = 4; -const STEP_COUNT_MAX = 150; -const MIN_CACHE_UPDATE_FREQ = 150; // 2 min 30 (150 sec) +const constants = require(__dirname + '/constants') /** * updateCache @@ -20,7 +17,7 @@ module.exports = (req, res, next) => co(function *() { let updateCache = false; // Cacluler s'il faut mettre à jour le cache ou pas - updateCache = (Math.floor(Date.now() / 1000) > (cache.lastUptime + MIN_CACHE_UPDATE_FREQ)); + updateCache = (Math.floor(Date.now() / 1000) > (cache.lastUptime + constants.MIN_CACHE_UPDATE_FREQ)); // Si le cache membersCount est dévérouillé, le vérouiller, sinon ne pas réinitialiser le cache if (updateCache && !cache.lockMembersCount) @@ -148,18 +145,18 @@ module.exports = (req, res, next) => co(function *() { { cache.beginBlock = yield duniterServer.dal.peerDAL.query('SELECT `medianTime`,`number` FROM block WHERE `fork`=0 AND `number`=0 LIMIT 1 '); } else if (req.query.begin > cache.endBlock[0].number) { - let beginTime = cache.endBlock[0].medianTime-(parseInt(cache.step)*unitTime*STEP_COUNT_MIN); + let beginTime = cache.endBlock[0].medianTime-(parseInt(cache.step)*unitTime*constants.STEP_COUNT_MIN); cache.beginBlock = yield duniterServer.dal.peerDAL.query('SELECT `medianTime`,`number` FROM block WHERE `fork`=0 AND `medianTime` >= \''+beginTime+'\' ORDER BY `medianTime` ASC LIMIT 1 '); } else { cache.beginBlock = yield duniterServer.dal.peerDAL.query('SELECT `medianTime`,`number` FROM block WHERE `fork`=0 AND `number`='+req.query.begin+' LIMIT 1 '); } // Apply STEP_COUNT_MAX and calculate stepTime - if ( Math.ceil((cache.endBlock[0].medianTime-cache.beginBlock[0].medianTime)/(cache.step*unitTime)) > STEP_COUNT_MAX ) - { cache.step = Math.ceil((cache.endBlock[0].medianTime-cache.beginBlock[0].medianTime)/(STEP_COUNT_MAX*unitTime)); } + if ( Math.ceil((cache.endBlock[0].medianTime-cache.beginBlock[0].medianTime)/(cache.step*unitTime)) > constants.STEP_COUNT_MAX ) + { cache.step = Math.ceil((cache.endBlock[0].medianTime-cache.beginBlock[0].medianTime)/(constants.STEP_COUNT_MAX*unitTime)); } cache.stepTime = parseInt(cache.step)*unitTime; // if new blocks and MIN_CACHE_UPDATE_FREQ pass, update cache - if ( parseInt(cache.endBlock[0].number) >= cache.currentBlockNumber && Math.floor(Date.now() / 1000) > (cache.lastUptime + MIN_CACHE_UPDATE_FREQ)) + if ( parseInt(cache.endBlock[0].number) >= cache.currentBlockNumber && Math.floor(Date.now() / 1000) > (cache.lastUptime + constants.MIN_CACHE_UPDATE_FREQ)) { // let previousCacheTime = (cache.blockchain.length > 0) ? cache.blockchain[cache.blockchain.length-1].medianTime:0; var newBlocks = yield duniterServer.dal.peerDAL.query( diff --git a/routes/blockCount.js b/routes/blockCount.js index 5272c24f2892103ba992f615a2121384a0bbc8a6..a03a86fc671f706575c17240cab58b7aeabbe329 100755 --- a/routes/blockCount.js +++ b/routes/blockCount.js @@ -29,9 +29,9 @@ module.exports = (req, res, next) => co(function *() { let newHashPreviousCurrentblock = yield duniterServer.dal.peerDAL.query('SELECT `hash` FROM block WHERE `fork`=0 AND `number` = '+(blockchain.length-1)+' LIMIT 1'); if ( hashPreviousCurrentblock != newHashPreviousCurrentblock ) { - blockchain.splice(0, blockchain.length); - hashPreviousCurrentblock = 0; - previousBlockchainTime = 0; + blockchain.splice(0, blockchain.length); + hashPreviousCurrentblock = 0; + previousBlockchainTime = 0; } } diff --git a/routes/members.js b/routes/members.js index bf7f698b2a73cb02f84155d5936221ced5d4327e..e23b09331d51c6fb62083d63d40202eba1c2008f 100755 --- a/routes/members.js +++ b/routes/members.js @@ -1,11 +1,12 @@ "use strict"; const co = require('co') -const wotb = require('wotb') -const timestampToDatetime = require(__dirname + '/../lib/timestampToDatetime') +const constants = require(__dirname + '/../lib/constants') + +const wotb = (constants.USE_WOTB6) ? require('wotb'):null; -const MIN_MEMBERS_UPDATE_FREQ = 180; +const timestampToDatetime = require(__dirname + '/../lib/timestampToDatetime') // Préserver les résultats en cache var lockMembers = false; @@ -69,10 +70,10 @@ module.exports = (req, res, next) => co(function *() { var format = req.query.format || 'HTML'; // Valeur par défaut // Alimenter wotb avec la toile actuelle - const wotbInstance = wotb.newFileInstance(duniterServer.home + '/wotb.bin'); + const wotbInstance = (constants.USE_WOTB6) ? wotb.newFileInstance(duniterServer.home + '/wotb.bin'):duniterServer.dal.wotb; // Vérifier si le cache doit être Réinitialiser - let reinitCache = (Math.floor(Date.now() / 1000) > (membersLastUptime + MIN_MEMBERS_UPDATE_FREQ)); + let reinitCache = (Math.floor(Date.now() / 1000) > (membersLastUptime + constants.MIN_MEMBERS_UPDATE_FREQ)); // Si changement de conditions, alors forcer le rechargement du cache s'il n'est pas, vérouillé, sinon forcer les conditions à celles en mémoire if (previousMode != mode || previousCentrality != centrality) @@ -183,37 +184,52 @@ module.exports = (req, res, next) => co(function *() { let tmpWot = wotbInstance.memCopy(); // Récupérer les informations détaillés de distance pour le membre courant - let tmpWot1 = wotbInstance.memCopy(); - let detailedDistance = tmpWot.detailedDistance(membersList[m].wotb_id, dSen, conf.stepMax, conf.xpercent); - membersNbSentriesUnreached[membersList[m].uid] = parseInt(detailedDistance.nbSentries)-parseInt(detailedDistance.nbSuccess); - - // Récupérer les informations détaillés de distance pour une nouvelle identité qui ne serait certifiée que par le membre courant (ce qui équivaut à récupérer les informations de distance pour le membre courant en décrémentant stepMax de 1) - let detailedDistanceQualityExt = tmpWot.detailedDistance(membersList[m].wotb_id, dSen, conf.stepMax-1, conf.xpercent); - - // Calculer la qualité du membre courant - membersQualityExt[membersList[m].uid] = ((detailedDistanceQualityExt.nbSuccess/detailedDistanceQualityExt.nbSentries)/conf.xpercent).toFixed(2); - if (membersQualityExt[membersList[m].uid] >= 1.0) + let detailedDistance = null; + if (constants.USE_WOTB6) { - proportionMembersWithQualityUpper1++; + detailedDistance = tmpWot.detailedDistance(membersList[m].wotb_id, dSen, conf.stepMax, conf.xpercent); } - - // Calculer la qualité du membre courant s'il n'y avait pas de référents (autrement di si tout les membres était référents) - let membersQualityIfNoSentries = ((detailedDistanceQualityExt.nbReached/membersList.length)/conf.xpercent).toFixed(2); - //console.log("membersQualityIfNoSentries[%s] = %s", membersList[m].uid, membersQualityIfNoSentries); - if (membersQualityIfNoSentries >= 1.0) + else { - proportionMembersWithQualityUpper1IfNoSentries++; + detailedDistance = { + isOutdistanced: tmpWot.isOutdistanced(membersList[m].wotb_id, dSen, conf.stepMax, conf.xpercent) + }; } - // Calculate meanSentriesReachedBySentriesInSingleExtCert, meanMembersReachedBySentriesInSingleExtCert, meanSentriesReachedByMembersInSingleExtCert and meanMembersReachedByMembersInSingleExtCert - if (currentMemberIsSentry) + + if (constants.USE_WOTB6) { - meanSentriesReachedBySentriesInSingleExtCert += parseFloat(((detailedDistanceQualityExt.nbSuccess/detailedDistanceQualityExt.nbSentries)*100).toFixed(2)); - meanMembersReachedBySentriesInSingleExtCert += parseFloat(((detailedDistanceQualityExt.nbReached/membersList.length)*100).toFixed(2)); - countSentries++; + // Calculate membersNbSentriesUnreached + membersNbSentriesUnreached[membersList[m].uid] = parseInt(detailedDistance.nbSentries)-parseInt(detailedDistance.nbSuccess); + + // Récupérer les informations détaillés de distance pour une nouvelle identité qui ne serait certifiée que par le membre courant (ce qui équivaut à récupérer les informations de distance pour le membre courant en décrémentant stepMax de 1) + let detailedDistanceQualityExt = tmpWot.detailedDistance(membersList[m].wotb_id, dSen, conf.stepMax-1, conf.xpercent); + + // Calculer la qualité du membre courant + membersQualityExt[membersList[m].uid] = ((detailedDistanceQualityExt.nbSuccess/detailedDistanceQualityExt.nbSentries)/conf.xpercent).toFixed(2); + if (membersQualityExt[membersList[m].uid] >= 1.0) + { + proportionMembersWithQualityUpper1++; + } + + // Calculer la qualité du membre courant s'il n'y avait pas de référents (autrement di si tout les membres était référents) + let membersQualityIfNoSentries = ((detailedDistanceQualityExt.nbReached/membersList.length)/conf.xpercent).toFixed(2); + //console.log("membersQualityIfNoSentries[%s] = %s", membersList[m].uid, membersQualityIfNoSentries); + if (membersQualityIfNoSentries >= 1.0) + { + proportionMembersWithQualityUpper1IfNoSentries++; + } + + // Calculate meanSentriesReachedBySentriesInSingleExtCert, meanMembersReachedBySentriesInSingleExtCert, meanSentriesReachedByMembersInSingleExtCert and meanMembersReachedByMembersInSingleExtCert + if (currentMemberIsSentry) + { + meanSentriesReachedBySentriesInSingleExtCert += parseFloat(((detailedDistanceQualityExt.nbSuccess/detailedDistanceQualityExt.nbSentries)*100).toFixed(2)); + meanMembersReachedBySentriesInSingleExtCert += parseFloat(((detailedDistanceQualityExt.nbReached/membersList.length)*100).toFixed(2)); + countSentries++; + } + meanSentriesReachedByMembersInSingleExtCert += parseFloat(((detailedDistanceQualityExt.nbSuccess/detailedDistanceQualityExt.nbSentries)*100).toFixed(2)); + meanMembersReachedByMembersInSingleExtCert += parseFloat(((detailedDistanceQualityExt.nbReached/membersList.length)*100).toFixed(2)); } - meanSentriesReachedByMembersInSingleExtCert += parseFloat(((detailedDistanceQualityExt.nbSuccess/detailedDistanceQualityExt.nbSentries)*100).toFixed(2)); - meanMembersReachedByMembersInSingleExtCert += parseFloat(((detailedDistanceQualityExt.nbReached/membersList.length)*100).toFixed(2)); // Nettoyer la wot temporaire tmpWot.clear(); @@ -514,16 +530,23 @@ module.exports = (req, res, next) => co(function *() { if (reinitCache) { - // Calculate mean Members/Sentries ReachedBy Members/Sentries InSingleExtCert - if (countSentries > 0) + if (constants.USE_WOTB6) { - meanSentriesReachedBySentriesInSingleExtCert = parseFloat((meanSentriesReachedBySentriesInSingleExtCert/countSentries).toFixed(2)); - meanMembersReachedBySentriesInSingleExtCert = parseFloat((meanMembersReachedBySentriesInSingleExtCert/countSentries).toFixed(2)); - } - if (membersList.length > 0) - { - meanSentriesReachedByMembersInSingleExtCert = parseFloat((meanSentriesReachedByMembersInSingleExtCert/membersList.length).toFixed(2)); - meanMembersReachedByMembersInSingleExtCert = parseFloat((meanMembersReachedByMembersInSingleExtCert/membersList.length).toFixed(2)); + // Calculate mean Members/Sentries ReachedBy Members/Sentries InSingleExtCert + if (countSentries > 0) + { + meanSentriesReachedBySentriesInSingleExtCert = parseFloat((meanSentriesReachedBySentriesInSingleExtCert/countSentries).toFixed(2)); + meanMembersReachedBySentriesInSingleExtCert = parseFloat((meanMembersReachedBySentriesInSingleExtCert/countSentries).toFixed(2)); + } + if (membersList.length > 0) + { + meanSentriesReachedByMembersInSingleExtCert = parseFloat((meanSentriesReachedByMembersInSingleExtCert/membersList.length).toFixed(2)); + meanMembersReachedByMembersInSingleExtCert = parseFloat((meanMembersReachedByMembersInSingleExtCert/membersList.length).toFixed(2)); + } + + //Calculate proportionMembersWithQualityUpper1 and proportionMembersWithQualityUpper1IfNoSentries + proportionMembersWithQualityUpper1 /= membersList.length; + proportionMembersWithQualityUpper1IfNoSentries /= membersList.length; } // recalculate meanCentrality and meanShortestsPathLength @@ -536,11 +559,7 @@ module.exports = (req, res, next) => co(function *() { meanCentrality /= membersCentrality.length; meanShortestsPathLength /= nbShortestsPath; } - - //Calculate proportionMembersWithQualityUpper1 and proportionMembersWithQualityUpper1IfNoSentries - proportionMembersWithQualityUpper1 /= membersList.length; - proportionMembersWithQualityUpper1IfNoSentries /= membersList.length; - + // Dévérouiller le cache members lockMembers = false; } @@ -557,6 +576,7 @@ module.exports = (req, res, next) => co(function *() { res.locals = { host: req.headers.host.toString(), + USE_WOTB6: constants.USE_WOTB6, // get parameters days, mode, sort_by, order, pendingSigs, centrality, diff --git a/routes/willMembers.js b/routes/willMembers.js index 376b5f145a5b5b9d6c51c1f54654a90c64f9a00a..42857c873e4ac5ae14cfbf8e32d0eda0c8f2d218 100755 --- a/routes/willMembers.js +++ b/routes/willMembers.js @@ -2,11 +2,12 @@ const co = require('co') const crypto = require('crypto') -const wotb = require('wotb') -const timestampToDatetime = require(__dirname + '/../lib/timestampToDatetime') +const constants = require(__dirname + '/../lib/constants') + +const wotb = (constants.USE_WOTB6) ? require('wotb'):null; -const MIN_WILLMEMBERS_UPDATE_FREQ = 180; +const timestampToDatetime = require(__dirname + '/../lib/timestampToDatetime') // Préserver les résultats en cache var lockWillMembers = false; @@ -56,12 +57,12 @@ module.exports = (req, res, next) => co(function *() { // Calculer le timestamp limite à prendre en compte let limitTimestamp = currentBlockchainTimestamp + (days*86400); - // Alimenter wotb avec la toile de confiance actuelle - const wotbInstance = wotb.newFileInstance(duniterServer.home + '/wotb.bin'); + // Alimenter wotb avec la toile de confiance + const wotbInstance = (constants.USE_WOTB6) ? wotb.newFileInstance(duniterServer.home + '/wotb.bin'):duniterServer.dal.wotb; // Vérifier si le cache doit être Réinitialiser - let reinitCache = (Math.floor(Date.now() / 1000) > (willMembersLastUptime + MIN_WILLMEMBERS_UPDATE_FREQ)); + let reinitCache = (Math.floor(Date.now() / 1000) > (willMembersLastUptime + constants.MIN_WILLMEMBERS_UPDATE_FREQ)); // Si le cache willMembers est dévérouillé, le vérouiller, sinon ne pas réinitialiser le cache if (reinitCache && !lockWillMembers) @@ -369,12 +370,15 @@ module.exports = (req, res, next) => co(function *() { let tmpWot = wotbInstance.memCopy(); // Mesurer la qualité externe de chaque emetteur de chaque certification - for (const cert of idtysPendingCertifsList[idMax]) + if (constants.USE_WOTB6) { - if ( typeof(membersQualityExt[cert.from]) == 'undefined' ) + for (const cert of idtysPendingCertifsList[idMax]) { - let detailedDistanceQualityExt = tmpWot.detailedDistance(cert.wotb_id, dSen, conf.stepMax-1, conf.xpercent); - membersQualityExt[cert.from] = ((detailedDistanceQualityExt.nbSuccess/detailedDistanceQualityExt.nbSentries)/conf.xpercent).toFixed(2); + if ( typeof(membersQualityExt[cert.from]) == 'undefined' ) + { + let detailedDistanceQualityExt = tmpWot.detailedDistance(cert.wotb_id, dSen, conf.stepMax-1, conf.xpercent); + membersQualityExt[cert.from] = ((detailedDistanceQualityExt.nbSuccess/detailedDistanceQualityExt.nbSentries)/conf.xpercent).toFixed(2); + } } } @@ -388,14 +392,14 @@ module.exports = (req, res, next) => co(function *() { } } // Récupérer les données de distance du dossier d'adhésion de l'indentité idMax - let detailedDistance = tmpWot.detailedDistance(pendingIdtyWID, dSen, conf.stepMax, conf.xpercent); + let detailedDistance = (constants.USE_WOTB6) ? tmpWot.detailedDistance(pendingIdtyWID, dSen, conf.stepMax, conf.xpercent):tmpWot.isOutdistanced(pendingIdtyWID, dSen, conf.stepMax, conf.xpercent); // Nettoyer la wot temporaire tmpWot.clear(); // Calculer percentSentriesReached et percentMembersReached - let percentSentriesReached = parseFloat(((detailedDistance.nbSuccess/detailedDistance.nbSentries)*100).toFixed(2)); - let percentMembersReached = parseFloat(((detailedDistance.nbReached/currentMembersCount)*100).toFixed(2)); + let percentSentriesReached = (constants.USE_WOTB6) ? parseFloat(((detailedDistance.nbSuccess/detailedDistance.nbSentries)*100).toFixed(2)):null; + let percentMembersReached = (constants.USE_WOTB6) ? parseFloat(((detailedDistance.nbReached/currentMembersCount)*100).toFixed(2)):null; // Pousser l'identité dans le tableau idtysListOrdered idtysListOrdered.push({ @@ -415,7 +419,7 @@ module.exports = (req, res, next) => co(function *() { }); // Si le cache a été réinitialiser, recalculer les sommes meanSentriesReachedByIdtyPerCert et meanMembersReachedByIdtyPerCert - if (reinitCache && identitiesList[idMax].nbValidPendingCert > 0) + if (constants.USE_WOTB6 && reinitCache && identitiesList[idMax].nbValidPendingCert > 0) { let nbReceiveCert = identitiesList[idMax].nbValidPendingCert; meanSentriesReachedByIdtyPerCert[nbReceiveCert-1] += percentSentriesReached; @@ -444,17 +448,20 @@ module.exports = (req, res, next) => co(function *() { if (reinitCache) { // Calculate meanSentriesReachedByIdtyPerCert and meanMembersReachedByIdtyPerCert - for (let i=0;i<=nbMaxCertifs;i++) - { - if ( countIdtiesPerReceiveCert[i] > 0 ) - { - meanSentriesReachedByIdtyPerCert[i] = parseFloat((meanSentriesReachedByIdtyPerCert[i]/countIdtiesPerReceiveCert[i]).toFixed(2)); - meanMembersReachedByIdtyPerCert[i] = parseFloat((meanMembersReachedByIdtyPerCert[i]/countIdtiesPerReceiveCert[i]).toFixed(2)); - } - else + if (constants.USE_WOTB6) + { + for (let i=0;i<=nbMaxCertifs;i++) { - meanSentriesReachedByIdtyPerCert[i] = 0.0; - meanMembersReachedByIdtyPerCert[i] = 0.0; + if ( countIdtiesPerReceiveCert[i] > 0 ) + { + meanSentriesReachedByIdtyPerCert[i] = parseFloat((meanSentriesReachedByIdtyPerCert[i]/countIdtiesPerReceiveCert[i]).toFixed(2)); + meanMembersReachedByIdtyPerCert[i] = parseFloat((meanMembersReachedByIdtyPerCert[i]/countIdtiesPerReceiveCert[i]).toFixed(2)); + } + else + { + meanSentriesReachedByIdtyPerCert[i] = 0.0; + meanMembersReachedByIdtyPerCert[i] = 0.0; + } } } @@ -474,6 +481,7 @@ module.exports = (req, res, next) => co(function *() { res.locals = { // Les varibles à passer au template host: req.headers.host.toString(), + USE_WOTB6: constants.USE_WOTB6, // get parameters days, sort_by, order, sortSig, showIdtyWithZeroCert, diff --git a/views/members.html b/views/members.html index 02ab744e1ee695380a153f6a0511374639a1cf90..df0c293d08f2eacd24c12f725d8ad7f15eae0bbe 100755 --- a/views/members.html +++ b/views/members.html @@ -32,7 +32,7 @@ ${(host.substr(host.length-6,6) == '.onion') ? HTML_TOR_HEAD:HTML_HEAD} <option name="sort_by" value ="oldestSig" ${sort_by == 'oldestSig' ? 'selected' : ''}>${LANG["SORT_BY_OLDEST_SIG"]} <option name="sort_by" value ="lastSig" ${sort_by == 'lastSig' ? 'selected' : ''}>${LANG["SORT_BY_LAST_SIG"]} <option name="sort_by" value ="centrality" ${sort_by == 'centrality' ? 'selected' : ''}>${LANG["SORT_BY_CENTRALITY"]} -<option name="sort_by" value ="quality" ${sort_by == 'quality' ? 'selected' : ''}>${LANG["SORT_BY_QUALITY"]} +${(USE_WOTB6) ? `<option name="sort_by" value ="quality" ${sort_by == 'quality' ? 'selected' : ''}>${LANG["SORT_BY_QUALITY"]}`:``} <option name="sort_by" value ="sigCount" ${sort_by == 'sigCount' ? 'selected' : ''}>${LANG["SORT_BY_SIG_COUNT"]} </select> ${LANG["ORDER_BY"]} <select name="order"> <option name="order" value ="asc"> ${LANG["ASC"]} @@ -76,15 +76,17 @@ ${(membersLastCentralityCalcTime==0) ? ` `} `} <br> -<table border="1"> - <tr><td align='center' colspan='3'>${LANG["DATA_AT"]} ${timestampToDatetime(membersLastUptime)}</td></tr> - <tr><td align='center'>${LANG["meanMembersReachedByMembersInSingleExtCert"]}</td><td align='center'>${LANG["SENTRIES_REACHED"]}</td><td align='center'>${LANG["MEMBERS_REACHED"]}</td></tr> - <tr><td align='center'>${LANG["SENTRY_CERT"]}</td><td align='center'>${meanSentriesReachedBySentriesInSingleExtCert}%</td><td align='center'>${meanMembersReachedBySentriesInSingleExtCert}%</td></tr> - <tr><td align='center'>${LANG["MEMBER_CERT"]}</td><td align='center'><font color="${(meanSentriesReachedByMembersInSingleExtCert<xpercent) ? 'DarkRed' : 'blue' }"><b>${meanSentriesReachedByMembersInSingleExtCert}%</b></font></td><td align='center'><b>${meanMembersReachedByMembersInSingleExtCert}%</b></td></tr> - <tr><td align='center'><b>${LANG["MEAN_QUALITY"]}</b></td><td align='center'><font color="red"><b>${(meanSentriesReachedByMembersInSingleExtCert/(xpercent*100)).toFixed(2)}</b></font></td><td align='center'><b>${(meanMembersReachedByMembersInSingleExtCert/(xpercent*100)).toFixed(2)}</b></td></tr> - <tr><td align='center'><b>${LANG["PROPORTION_MEMBERS_WITH_QUALITY_UPPER_1"]}</b></td><td align='center'><font color="red"><b>${(proportionMembersWithQualityUpper1*100).toFixed(2)}%</b></font></td><td align='center'><b>${(proportionMembersWithQualityUpper1IfNoSentries*100).toFixed(2)}%</b></td></tr> -</table> -<br> +${(USE_WOTB6) ? ` + <table border="1"> + <tr><td align='center' colspan='3'>${LANG["DATA_AT"]} ${timestampToDatetime(membersLastUptime)}</td></tr> + <tr><td align='center'>${LANG["meanMembersReachedByMembersInSingleExtCert"]}</td><td align='center'>${LANG["SENTRIES_REACHED"]}</td><td align='center'>${LANG["MEMBERS_REACHED"]}</td></tr> + <tr><td align='center'>${LANG["SENTRY_CERT"]}</td><td align='center'>${meanSentriesReachedBySentriesInSingleExtCert}%</td><td align='center'>${meanMembersReachedBySentriesInSingleExtCert}%</td></tr> + <tr><td align='center'>${LANG["MEMBER_CERT"]}</td><td align='center'><font color="${(meanSentriesReachedByMembersInSingleExtCert<xpercent) ? 'DarkRed' : 'blue' }"><b>${meanSentriesReachedByMembersInSingleExtCert}%</b></font></td><td align='center'><b>${meanMembersReachedByMembersInSingleExtCert}%</b></td></tr> + <tr><td align='center'><b>${LANG["MEAN_QUALITY"]}</b></td><td align='center'><font color="red"><b>${(meanSentriesReachedByMembersInSingleExtCert/(xpercent*100)).toFixed(2)}</b></font></td><td align='center'><b>${(meanMembersReachedByMembersInSingleExtCert/(xpercent*100)).toFixed(2)}</b></td></tr> + <tr><td align='center'><b>${LANG["PROPORTION_MEMBERS_WITH_QUALITY_UPPER_1"]}</b></td><td align='center'><font color="red"><b>${(proportionMembersWithQualityUpper1*100).toFixed(2)}%</b></font></td><td align='center'><b>${(proportionMembersWithQualityUpper1IfNoSentries*100).toFixed(2)}%</b></td></tr> + </table> + <br> +`:``} <!-- Afficher le currentBlockchainTimestamp --> <i>${LANG["CURRENT_BLOCKCHAIN_TIME"]} : ${timestampToDatetime(currentBlockchainTimestamp)}.</i><br> @@ -113,7 +115,9 @@ ${(membersLastCentralityCalcTime==0) ? ` <b>${member.uid}</b><br> ${(member.isSentry) ? `<font color="blue">${LANG['REFERRING_MEMBER']} : ${LANG['YES']}</font>`:`${LANG['REFERRING_MEMBER']} : ${LANG['NO']}`}<br> - ${LANG['QUALITY_EXT']} : <b>${(typeof(membersQualityExt[member.uid])=='undefined') ? `0.00`:membersQualityExt[member.uid]}</b><br> + ${(USE_WOTB6) ? ` + ${LANG['QUALITY_EXT']} : <b>${(typeof(membersQualityExt[member.uid])=='undefined') ? `0.00`:membersQualityExt[member.uid]}</b><br> + `:``} <b>${(membersLastCentralityCalcTime==0) ? `${LANG['CENTRALITY']} : ?`:` ${LANG['CENTRALITY']} : <b>${(typeof(membersCentrality[member.wotb_id])=='undefined') ? `0`:membersCentrality[member.wotb_id]} `}</b><br> @@ -133,10 +137,13 @@ ${(membersLastCentralityCalcTime==0) ? ` <td align="center" style="background:hsla(${member.proportion}, 100%, 50%, 1)"> ${timestampToDatetime(member.expireMembershipTimestamp)}</td> <td align='center' style="background:hsla(${member.proportion}, 100%, 50%, 1)"> - <font color="${member.detailedDistance.isOutdistanced ? 'red' : 'blue' }"> - ${member.detailedDistance.isOutdistanced ? LANG['COL_DISTANCE_isOutdistanced'] : LANG['COL_DISTANCE_isNotOutdistanced'] } - <br>${member.percentSentriesReached}% (${member.detailedDistance.nbSuccess}/${member.detailedDistance.nbSentries}) - </font> + + <font color="${member.detailedDistance.isOutdistanced ? 'red' : 'blue' }"> + ${member.detailedDistance.isOutdistanced ? LANG['COL_DISTANCE_isOutdistanced'] : LANG['COL_DISTANCE_isNotOutdistanced'] } + ${(USE_WOTB6) ? ` + <br>${member.percentSentriesReached}% (${member.detailedDistance.nbSuccess}/${member.detailedDistance.nbSentries}) + `:``} + </font> </td> <td style="background:#000000">-</td> diff --git a/views/willMembers.html b/views/willMembers.html index 6aa3336df6ba3ec7c6f8d092b4fac010ce1a4790..ed4affe4c4d48be3c6d0931424eda59ae4395885 100755 --- a/views/willMembers.html +++ b/views/willMembers.html @@ -83,64 +83,66 @@ ${(help != 'no') ? ` `:''} <!-- Afficher l'état de tension de la toile de confiance --> -<div id="zone2" style="width: 100%; height: 20px; background: White; border: 1px solid DimGrey; transition: height 1s; -moz-transition: height 1s;-webkit-transition: height 1s;-o-transition: height 1s; overflow: hidden;"> - <div id="bandeau2" style="height: 20px; width: 100%; font-size: medium; color: white; background-color: darkgrey;" onmouseover="deroule(2,150);" onmouseout="deroule(2,20);"><b>${LANG["WOT_TENSION_STATE"]}</b> - </div> - <div id="texte2" style="float: left;"> - <table border="1"> - <tr> - <td align='center'>${LANG["NUMBER_OF_RECEIVED_CERTS"]}</td><td align='center'>1</td><td align='center'>2</td><td align='center'>3</td><td align='center'>4</td><td align='center'>5</td> - ${(nbMaxCertifs>5) ? `<td align='center'>6</td>`:``} - ${(nbMaxCertifs>6) ? `<td align='center'>7</td>`:``} - ${(nbMaxCertifs>7) ? `<td align='center'>8</td>`:``} - ${(nbMaxCertifs>8) ? `<td align='center'>9</td>`:``} - ${(nbMaxCertifs>9) ? `<td align='center'>10</td>`:``} - </tr> - <!-- Afficher les moyennes SentriesReachedByIdtyPerCert --> - <tr> - <td align='center'>${LANG["MEAN_SENTRIES_REACHED"]}</td> - <td><font color="${(meanSentriesReachedByIdtyPerCert[0]<xpercent) ? 'DarkRed' : 'blue' }"><b>${meanSentriesReachedByIdtyPerCert[0]}%</b></font></td> - <td><font color="${(meanSentriesReachedByIdtyPerCert[1]<xpercent) ? 'DarkRed' : 'blue' }"><b>${meanSentriesReachedByIdtyPerCert[1]}%</b></font></td> - <td><font color="${(meanSentriesReachedByIdtyPerCert[2]<xpercent) ? 'DarkRed' : 'blue' }"><b>${meanSentriesReachedByIdtyPerCert[2]}%</b></font></td> - <td><font color="${(meanSentriesReachedByIdtyPerCert[3]<xpercent) ? 'DarkRed' : 'blue' }"><b>${meanSentriesReachedByIdtyPerCert[3]}%</b></font></td> - <td><font color="${(meanSentriesReachedByIdtyPerCert[4]<xpercent) ? 'DarkRed' : 'blue' }"><b>${meanSentriesReachedByIdtyPerCert[4]}%</b></font></td> - ${(nbMaxCertifs>5) ? `<td><font color="${(meanSentriesReachedByIdtyPerCert[5]<xpercent) ? 'DarkRed' : 'blue' }"><b>${meanSentriesReachedByIdtyPerCert[5]}%</b></font></td>`:``} - ${(nbMaxCertifs>6) ? `<td><font color="${(meanSentriesReachedByIdtyPerCert[6]<xpercent) ? 'DarkRed' : 'blue' }"><b>${meanSentriesReachedByIdtyPerCert[6]}%</b></font></td>`:``} - ${(nbMaxCertifs>7) ? `<td><font color="${(meanSentriesReachedByIdtyPerCert[7]<xpercent) ? 'DarkRed' : 'blue' }"><b>${meanSentriesReachedByIdtyPerCert[7]}%</b></font></td>`:``} - ${(nbMaxCertifs>8) ? `<td><font color="${(meanSentriesReachedByIdtyPerCert[8]<xpercent) ? 'DarkRed' : 'blue' }"><b>${meanSentriesReachedByIdtyPerCert[8]}%</b></font></td>`:``} - ${(nbMaxCertifs>9) ? `<td><font color="${(meanSentriesReachedByIdtyPerCert[9]<xpercent) ? 'DarkRed' : 'blue' }"><b>${meanSentriesReachedByIdtyPerCert[9]}%</b></font></td>`:``} - </tr> - <!-- Afficher les qualités moyennes --> - <tr> - <td align='center'>${LANG["MEAN_QUALITY_CERTS"]}</td> - <td align='center'><font color="${(meanSentriesReachedByIdtyPerCert[0]<xpercent) ? 'DarkRed' : 'blue' }"><b>${(meanSentriesReachedByIdtyPerCert[0]/(xpercent*100)).toFixed(2)}</b></font></td> - <td align='center'><font color="${(meanSentriesReachedByIdtyPerCert[1]<xpercent) ? 'DarkRed' : 'blue' }"><b>${(meanSentriesReachedByIdtyPerCert[1]/(xpercent*100)).toFixed(2)}</b></font></td> - <td align='center'><font color="${(meanSentriesReachedByIdtyPerCert[2]<xpercent) ? 'DarkRed' : 'blue' }"><b>${(meanSentriesReachedByIdtyPerCert[2]/(xpercent*100)).toFixed(2)}</b></font></td> - <td align='center'><font color="${(meanSentriesReachedByIdtyPerCert[3]<xpercent) ? 'DarkRed' : 'blue' }"><b>${(meanSentriesReachedByIdtyPerCert[3]/(xpercent*100)).toFixed(2)}</b></font></td> - <td align='center'><font color="${(meanSentriesReachedByIdtyPerCert[4]<xpercent) ? 'DarkRed' : 'blue' }"><b>${(meanSentriesReachedByIdtyPerCert[4]/(xpercent*100)).toFixed(2)}</b></font></td> - ${(nbMaxCertifs>5) ? `<td align='center'><font color="${(meanSentriesReachedByIdtyPerCert[5]<xpercent) ? 'DarkRed' : 'blue' }"><b>${(meanSentriesReachedByIdtyPerCert[5]/(xpercent*100)).toFixed(2)}</b></font></td>`:``} - ${(nbMaxCertifs>6) ? `<td align='center'><font color="${(meanSentriesReachedByIdtyPerCert[6]<xpercent) ? 'DarkRed' : 'blue' }"><b>${(meanSentriesReachedByIdtyPerCert[6]/(xpercent*100)).toFixed(2)}</b></font></td>`:``} - ${(nbMaxCertifs>7) ? `<td align='center'><font color="${(meanSentriesReachedByIdtyPerCert[7]<xpercent) ? 'DarkRed' : 'blue' }"><b>${(meanSentriesReachedByIdtyPerCert[7]/(xpercent*100)).toFixed(2)}</b></font></td>`:``} - ${(nbMaxCertifs>8) ? `<td align='center'><font color="${(meanSentriesReachedByIdtyPerCert[8]<xpercent) ? 'DarkRed' : 'blue' }"><b>${(meanSentriesReachedByIdtyPerCert[8]/(xpercent*100)).toFixed(2)}</b></font></td>`:``} - ${(nbMaxCertifs>9) ? `<td align='center'><font color="${(meanSentriesReachedByIdtyPerCert[9]<xpercent) ? 'DarkRed' : 'blue' }"><b>${(meanSentriesReachedByIdtyPerCert[9]/(xpercent*100)).toFixed(2)}</b></font></td>`:``} - </tr> - <!-- Afficher les moyennes MembersReachedByIdtyPerCert --> - <tr> - <td align='center'>${LANG["MEAN_MEMBERS_REACHED"]}</td> - <td><b>${meanMembersReachedByIdtyPerCert[0]}%</b></td> - <td><b>${meanMembersReachedByIdtyPerCert[1]}%</b></td> - <td><b>${meanMembersReachedByIdtyPerCert[2]}%</b></td> - <td><b>${meanMembersReachedByIdtyPerCert[3]}%</b></td> - <td><b>${meanMembersReachedByIdtyPerCert[4]}%</b></td> - ${(nbMaxCertifs>5) ? `<td><b>${meanMembersReachedByIdtyPerCert[5]}%</b></td>`:``} - ${(nbMaxCertifs>6) ? `<td><b>${meanMembersReachedByIdtyPerCert[6]}%</b></td>`:``} - ${(nbMaxCertifs>7) ? `<td><b>${meanMembersReachedByIdtyPerCert[7]}%</b></td>`:``} - ${(nbMaxCertifs>8) ? `<td><b>${meanMembersReachedByIdtyPerCert[8]}%</b></td>`:``} - ${(nbMaxCertifs>9) ? `<td><b>${meanMembersReachedByIdtyPerCert[9]}%</b></td>`:``} - </tr> - </table> +${ (USE_WOTB6) ? ` + <div id="zone2" style="width: 100%; height: 20px; background: White; border: 1px solid DimGrey; transition: height 1s; -moz-transition: height 1s;-webkit-transition: height 1s;-o-transition: height 1s; overflow: hidden;"> + <div id="bandeau2" style="height: 20px; width: 100%; font-size: medium; color: white; background-color: darkgrey;" onmouseover="deroule(2,150);" onmouseout="deroule(2,20);"><b>${LANG["WOT_TENSION_STATE"]}</b> + </div> + <div id="texte2" style="float: left;"> + <table border="1"> + <tr> + <td align='center'>${LANG["NUMBER_OF_RECEIVED_CERTS"]}</td><td align='center'>1</td><td align='center'>2</td><td align='center'>3</td><td align='center'>4</td><td align='center'>5</td> + ${(nbMaxCertifs>5) ? `<td align='center'>6</td>`:``} + ${(nbMaxCertifs>6) ? `<td align='center'>7</td>`:``} + ${(nbMaxCertifs>7) ? `<td align='center'>8</td>`:``} + ${(nbMaxCertifs>8) ? `<td align='center'>9</td>`:``} + ${(nbMaxCertifs>9) ? `<td align='center'>10</td>`:``} + </tr> + <!-- Afficher les moyennes SentriesReachedByIdtyPerCert --> + <tr> + <td align='center'>${LANG["MEAN_SENTRIES_REACHED"]}</td> + <td><font color="${(meanSentriesReachedByIdtyPerCert[0]<xpercent) ? 'DarkRed' : 'blue' }"><b>${meanSentriesReachedByIdtyPerCert[0]}%</b></font></td> + <td><font color="${(meanSentriesReachedByIdtyPerCert[1]<xpercent) ? 'DarkRed' : 'blue' }"><b>${meanSentriesReachedByIdtyPerCert[1]}%</b></font></td> + <td><font color="${(meanSentriesReachedByIdtyPerCert[2]<xpercent) ? 'DarkRed' : 'blue' }"><b>${meanSentriesReachedByIdtyPerCert[2]}%</b></font></td> + <td><font color="${(meanSentriesReachedByIdtyPerCert[3]<xpercent) ? 'DarkRed' : 'blue' }"><b>${meanSentriesReachedByIdtyPerCert[3]}%</b></font></td> + <td><font color="${(meanSentriesReachedByIdtyPerCert[4]<xpercent) ? 'DarkRed' : 'blue' }"><b>${meanSentriesReachedByIdtyPerCert[4]}%</b></font></td> + ${(nbMaxCertifs>5) ? `<td><font color="${(meanSentriesReachedByIdtyPerCert[5]<xpercent) ? 'DarkRed' : 'blue' }"><b>${meanSentriesReachedByIdtyPerCert[5]}%</b></font></td>`:``} + ${(nbMaxCertifs>6) ? `<td><font color="${(meanSentriesReachedByIdtyPerCert[6]<xpercent) ? 'DarkRed' : 'blue' }"><b>${meanSentriesReachedByIdtyPerCert[6]}%</b></font></td>`:``} + ${(nbMaxCertifs>7) ? `<td><font color="${(meanSentriesReachedByIdtyPerCert[7]<xpercent) ? 'DarkRed' : 'blue' }"><b>${meanSentriesReachedByIdtyPerCert[7]}%</b></font></td>`:``} + ${(nbMaxCertifs>8) ? `<td><font color="${(meanSentriesReachedByIdtyPerCert[8]<xpercent) ? 'DarkRed' : 'blue' }"><b>${meanSentriesReachedByIdtyPerCert[8]}%</b></font></td>`:``} + ${(nbMaxCertifs>9) ? `<td><font color="${(meanSentriesReachedByIdtyPerCert[9]<xpercent) ? 'DarkRed' : 'blue' }"><b>${meanSentriesReachedByIdtyPerCert[9]}%</b></font></td>`:``} + </tr> + <!-- Afficher les qualités moyennes --> + <tr> + <td align='center'>${LANG["MEAN_QUALITY_CERTS"]}</td> + <td align='center'><font color="${(meanSentriesReachedByIdtyPerCert[0]<xpercent) ? 'DarkRed' : 'blue' }"><b>${(meanSentriesReachedByIdtyPerCert[0]/(xpercent*100)).toFixed(2)}</b></font></td> + <td align='center'><font color="${(meanSentriesReachedByIdtyPerCert[1]<xpercent) ? 'DarkRed' : 'blue' }"><b>${(meanSentriesReachedByIdtyPerCert[1]/(xpercent*100)).toFixed(2)}</b></font></td> + <td align='center'><font color="${(meanSentriesReachedByIdtyPerCert[2]<xpercent) ? 'DarkRed' : 'blue' }"><b>${(meanSentriesReachedByIdtyPerCert[2]/(xpercent*100)).toFixed(2)}</b></font></td> + <td align='center'><font color="${(meanSentriesReachedByIdtyPerCert[3]<xpercent) ? 'DarkRed' : 'blue' }"><b>${(meanSentriesReachedByIdtyPerCert[3]/(xpercent*100)).toFixed(2)}</b></font></td> + <td align='center'><font color="${(meanSentriesReachedByIdtyPerCert[4]<xpercent) ? 'DarkRed' : 'blue' }"><b>${(meanSentriesReachedByIdtyPerCert[4]/(xpercent*100)).toFixed(2)}</b></font></td> + ${(nbMaxCertifs>5) ? `<td align='center'><font color="${(meanSentriesReachedByIdtyPerCert[5]<xpercent) ? 'DarkRed' : 'blue' }"><b>${(meanSentriesReachedByIdtyPerCert[5]/(xpercent*100)).toFixed(2)}</b></font></td>`:``} + ${(nbMaxCertifs>6) ? `<td align='center'><font color="${(meanSentriesReachedByIdtyPerCert[6]<xpercent) ? 'DarkRed' : 'blue' }"><b>${(meanSentriesReachedByIdtyPerCert[6]/(xpercent*100)).toFixed(2)}</b></font></td>`:``} + ${(nbMaxCertifs>7) ? `<td align='center'><font color="${(meanSentriesReachedByIdtyPerCert[7]<xpercent) ? 'DarkRed' : 'blue' }"><b>${(meanSentriesReachedByIdtyPerCert[7]/(xpercent*100)).toFixed(2)}</b></font></td>`:``} + ${(nbMaxCertifs>8) ? `<td align='center'><font color="${(meanSentriesReachedByIdtyPerCert[8]<xpercent) ? 'DarkRed' : 'blue' }"><b>${(meanSentriesReachedByIdtyPerCert[8]/(xpercent*100)).toFixed(2)}</b></font></td>`:``} + ${(nbMaxCertifs>9) ? `<td align='center'><font color="${(meanSentriesReachedByIdtyPerCert[9]<xpercent) ? 'DarkRed' : 'blue' }"><b>${(meanSentriesReachedByIdtyPerCert[9]/(xpercent*100)).toFixed(2)}</b></font></td>`:``} + </tr> + <!-- Afficher les moyennes MembersReachedByIdtyPerCert --> + <tr> + <td align='center'>${LANG["MEAN_MEMBERS_REACHED"]}</td> + <td><b>${meanMembersReachedByIdtyPerCert[0]}%</b></td> + <td><b>${meanMembersReachedByIdtyPerCert[1]}%</b></td> + <td><b>${meanMembersReachedByIdtyPerCert[2]}%</b></td> + <td><b>${meanMembersReachedByIdtyPerCert[3]}%</b></td> + <td><b>${meanMembersReachedByIdtyPerCert[4]}%</b></td> + ${(nbMaxCertifs>5) ? `<td><b>${meanMembersReachedByIdtyPerCert[5]}%</b></td>`:``} + ${(nbMaxCertifs>6) ? `<td><b>${meanMembersReachedByIdtyPerCert[6]}%</b></td>`:``} + ${(nbMaxCertifs>7) ? `<td><b>${meanMembersReachedByIdtyPerCert[7]}%</b></td>`:``} + ${(nbMaxCertifs>8) ? `<td><b>${meanMembersReachedByIdtyPerCert[8]}%</b></td>`:``} + ${(nbMaxCertifs>9) ? `<td><b>${meanMembersReachedByIdtyPerCert[9]}%</b></td>`:``} + </tr> + </table> + </div> </div> -</div> +`:``} <!-- Afficher le currentBlockchainTimestamp et le nombre d'identités au dossier complet --> ${LANG["BLOCKCHAIN_TIME"]} : <b>${timestampToDatetime(currentBlockchainTimestamp)}</b> (#<b>${currentBlockNumber}</b>).<br> @@ -175,10 +177,14 @@ ${(help != 'no') ? ` </td> ${(idty.expires_on > 0) ? ` <td align='center' style="background:${idty.colorPending}"> - ${(idty.membership && !idty.detailedDistance.isOutdistanced && idty.nbValidPendingCert >= sigQty) ? `<font color="green">${LANG['OK']}` : `<font color="DarkRed">${LANG['KO']}` }</font> - <br>${LANG['MEMBERSHIP_ASKED']} : ${idty.membership? `<font color="green">${LANG['YES']}` : `<font color="DarkRed">${LANG['NO']}` }</font> - <br><font color="${idty.detailedDistance.isOutdistanced ? 'DarkRed' : 'blue' }">${idty.percentSentriesReached}% (${idty.detailedDistance.nbSuccess}/${idty.detailedDistance.nbSentries}) - <br>${LANG['QUALITY_CERTIFIERS']} : <b>${(idty.validBlockStamp) ? ((idty.detailedDistance.nbSuccess/idty.detailedDistance.nbSentries)/xpercent).toFixed(2):`0.00`}</b></font> + ${(idty.membership && !idty.detailedDistance.isOutdistanced && idty.nbValidPendingCert >= sigQty) ? `<font color="green">${LANG['OK']}` : `<font color="DarkRed">${LANG['KO']}` }</font><br> + ${LANG['MEMBERSHIP_ASKED']} : ${idty.membership? `<font color="green">${LANG['YES']}` : `<font color="DarkRed">${LANG['NO']}` }</font><br> + ${ (USE_WOTB6) ? ` + <font color="${idty.detailedDistance.isOutdistanced ? 'DarkRed' : 'blue' }">${idty.percentSentriesReached}% (${idty.detailedDistance.nbSuccess}/${idty.detailedDistance.nbSentries}) + <br>${LANG['QUALITY_CERTIFIERS']} : <b>${(idty.validBlockStamp) ? ((idty.detailedDistance.nbSuccess/idty.detailedDistance.nbSentries)/xpercent).toFixed(2):`0.00`}</b></font> + `:` + <font color="${idty.detailedDistance ? 'DarkRed' : 'blue' }">${LANG['DISTANCE']} : ${idty.detailedDistance ? LANG['KO']:LANG['OK'] }</font> + `} <br>${LANG['CERTIFIERS_COUNT']} : ${(idty.nbValidPendingCert >= sigQty) ? `<font color="green">${idty.nbValidPendingCert}/${sigQty}` : `<font color="DarkRed">${idty.nbValidPendingCert}/${sigQty}` }</font> </td> `:` @@ -193,7 +199,9 @@ ${(help != 'no') ? ` ${cert.issuerIsSentry ? '<b>':''} <a href="wotex?lg=${MENU_LANG['LG']}${(typeof(help) != 'undefined' && help == 'no') ? '&help=no':''}&to=${cert['from']}&pending=on&mode=undefined">${cert['from']}</a> ${cert.issuerIsSentry ? '</b>':''} - <br>${LANG['QUALITY']} : <b>${(typeof(membersQualityExt[cert.from])=='undefined' || !cert.validBlockStamp) ? `0.00`:membersQualityExt[cert.from]}</b> + ${ (USE_WOTB6) ? ` + <br>${LANG['QUALITY']} : <b>${(typeof(membersQualityExt[cert.from])=='undefined' || !cert.validBlockStamp) ? `0.00`:membersQualityExt[cert.from]}</b> + `:''} <br>${timestampToDatetime(cert.timestampExpire)} <br>#${cert['blockNumber']} ${j==(4+idty.pendingCertifications.length-idty.nbValidPendingCert)?'<b>':''}