ГЪРМИ ГОЛЯМ СКАНДАЛ! Огромна афера с машините – зам.-министърът Стойнов изпратил кода на шефа на „Информационно обслужване“
Няколко медии тази сутрин получиха сигнал, свързан с поредната афера с кода на машините. Сигналът разкрива кореспонденция между зам.-министърът на електронното управление Михаил Стойнов и шефът на „Информационно обслужване“ Ивайло Филипов. В мейлът, който изпраща Стойнов, той публикува и част от изходния код за машините с инструкции „може да се използва“, пише ПИК.
Публикуваме сигнала без редакторска намеса, както и кодът, който е изпратен до шефа на „Информационно обслужване“:
Subject: СИГНАЛ: Кореспонденция за готвената измама с машините от заместник министър Стойнов
Уважаеми дами и господа,
Приложено изпращам e-mail кореспонденция, в която зам.-министър Михаил Стойнов изпраща части код на Ивайло Филипов, изпълнителен директор на „Информационно обслужване“ АД, които извършват броене на резултатите от изборите, с инструкции това да „може да се използва“, както и че го чака да каже дали е ок за да продължи със стъпките.
Поне на мен ми се струва че това е пряка подготовка за подмяна на резултати, с или без машини!
Предвид функциите ми на държавен служител моля да остана анонимен.
С пожелание за успех в борбата с измамите!
Г. Коларов
E-Mail log extract:
From: Mihail Stoynov<m.stoynov@egov.government.bg>
Date: Thursday, 26 October 2023 at 09:24
To: Ivaylo Filipov<i.filipov@is-bg.net>
Subject: За преглед</i.filipov@is-bg.net></m.stoynov@egov.government.bg>
Здрасти,
Както говорихме, прегледах нещата и извадих следното, което може да ползваш при подготовката за уикенда. Когато си готов ми кажи и да задействам останалата част защото нямаме много време.
Ето извадката:
// Fix some compatibility issues
if (typeof console === „undefined“) console = {};
if (typeof console.log === „undefined“) console.log = function(n) {};
if (typeof Array.prototype.push === „undefined“) {
Array.prototype.push = function(n) {
var i;
if (n instanceof Array) {
for (i = 0; i < n.length; i++) this[this.length] = n[i];
return this;
}
this[this.length] = n;
return this;
};
}
if (typeof Array.prototype.forEach === „undefined“) {
Array.prototype.forEach = function(n) {
var i;
for (i = 0; i < this.length; i++) n(this[i]);
};
}
if (typeof Array.prototype.map === „undefined“) {
Array.prototype.map = function(n) {
var i;
var a = [];
for (i = 0; i < this.length; i++) a[a.length] = n(this[i]);
return a;
};
}
if (typeof Object.prototype.keys === „undefined“) {
Object.prototype.keys = function(n) {
var i;
var a = [];
for (i in n) {
a[a.length] = i;
}
return a;
};
}
if (typeof document.getElementsByClassName === „undefined“) {
document.getElementsByClassName = function(n) {
var a = [];
var cl = n.split(/ +/);
var e = document.getElementsByTagName(‘*’);
var i;
var j;
for (i = 0; i < e.length; i++) {
for (j = 0; j < cl.length; j++) {
if (RegExp(‘ ‘ + cl[j] + ‘ ‘).test(‘ ‘ + e[i].className + ‘ ‘)) {
a[a.length] = e[i];
break;
}
}
}
return a;
};
}
// –-
function BgElections2013codeV4() {
// Translation from Visual Basic to JavaScript
var InputData;
var x;
var y;
var MIR;
var Parties;
var Total;
var lowPerc = parseFloat(document.getElementById(„lowPerc“).value);
MIR = parseInt(document.getElementById(„dim_mir“).value);
Parties = parseInt(document.getElementById(„dim_party“).value);
var p = readSpecs();
console.log(p);
filterLowPerc(p, lowPerc);
Parties = p.party.length; // Remove all the parties with less than 4%
console.log(p); // Lets dump what we have here
// Now we have in P only the values of the parties to compute
var i;
var j;
var mandates = [];
var totMandates = []; // we shall see when we use the totMandates at all, as it looks like the globalMandates is more important
// Distrubute the mandates
for (i = 0; i < Parties; i++) {
mandates[i] = [];
for (j = 0; j < MIR; j++) {
mandates[i][j] = p.mir[j].mandates * p.party[i].partyVotes[j] / p.mir[j].reTotalSum; // Error, not global totalsum
}
totMandates[i] = sumArray(mandates[i]);
}
// Distribution of the seats between the parties on a national level, 1st step
var globalMandates = [];
for (i = 0; i < Parties; i++) globalMandates[i] = p.totalMandates * p.party[i].partySum / p.reTotalSum;
// integer parts and fractions are separated in two new tables
var intMandates = [];
var intTotMandates = [];
var fracMandates = [];
var fracTotMandates = [];
for (i = 0; i < Parties; i++) {
intMandates[i] = [];
fracMandates[i] = [];
for (j = 0; j < MIR; j++) {
intMandates[i][j] = parseInt(mandates[i][j]);
fracMandates[i][j] = mandates[i][j] – intMandates[i][j];
}
intTotMandates[i] = parseInt(globalMandates[i]); // globalMandates instead of totMandates
fracTotMandates[i] = globalMandates[i] – intTotMandates[i]; // globalMandates instead of totMandates
}
// Lets compute the non distributed seats
// Here we compute the non-distributed seats by constituency (MIR)
var undistSeats = [];
for (j = 0; j < MIR; j++) {
undistSeats[j] = p.mir[j].mandates – sumCol(intMandates, j);
}
var totUndMandates = p.totalMandates – sumArray(intTotMandates); //totalMandates is missing
// Make some cells bold (used in the calculation later, those are the first X (undistributed) mandates in the column)
var bolded = [];
for (i = 0; i < Parties; i++) {
bolded[i] = [];
for (j = 0; j < MIR; j++) {
bolded[i][j] = 0;
var r = rankCol(fracMandates[i][j], fracMandates, j);
if (r <= undistSeats[j]) bolded[i][j] = 1;
}
}
var totBolded = [];
for (i = 0; i < Parties; i++) {
totBolded[i] = 0;
if (rank(fracTotMandates[i], fracTotMandates) <= totUndMandates) totBolded[i] = 1;
}
var winMandates = [];
// Calculate number of seats per party STEP 1
for (i = 0; i < Parties; i++) {
winMandates[i] = parseInt(globalMandates[i]) + totBolded[i];
} //globalMandates instead of totMandates
// Lets calculate the difference between the direct mandates and the mandate redistribution
// It is possible to have situation where we have removal of a mandate instead of adding one, which is wrong
var parMandates = [];
for (i = 0; i < Parties; i++) {
parMandates[i] = winMandates[i] – sumArray(intMandates[i]);
if (parMandates[i] < 0) {
alert(„Sorry, we have a problem in STEP2nwe can not distribute a negative number of seatsnPlease send a message to CIKncik@cik.bg“);
}
}
//
var diffMandates = []; // Here we compute the excedence
for (i = 0; i < Parties; i++) {
diffMandates[i] = sumArray(bolded[i]) – parMandates[i];
}
// the table with the whole and the distributed mandates together
var tab4Mandates = [];
for (i = 0; i < Parties; i++) {
tab4Mandates[i] = [];
for (j = 0; j < MIR; j++) {
tab4Mandates[i][j] = bolded[i][j] + intMandates[i][j];
}
}
var tab4giveMandates = [];
var tab4wonMandates = [];
for (i = 0; i < Parties; i++) {
tab4giveMandates[i] = sumArray(tab4Mandates[i]);
tab4wonMandates[i] = winMandates[i];
}
// Table 3
var tab3sumMandates = [];
for (i = 0; i < Parties; i++) {
tab3sumMandates[i] = sumArray(intMandates[i]);
}
var tab3leftMandates = [];
for (i = 0; i < Parties; i++) {
tab3leftMandates[i] = winMandates[i] – tab3sumMandates[i];
}
// –– Mandate redistribution
// From now on we work only on table 5 (fracMandates)
// In the original code there is a duplication, so I am skipping it, diffMandates[i] contains the excedence already
// The main calculation for the mandate redistribution
var Timer;
var finalTable = [];
var boldCellPlus = [];
// var boldCellMinus = [];
var Iplus;
var Jplus;
var Iminus;
// var Jminus;
// var K;
var PlusCounter;
var cellMinus = [];
// var c = [];
var Min;
var colorIndex = []; // We are moving the colorIndex outside
// – Checked up to here
for (Timer = 0; Timer < 200; Timer++) {
PlusCounter = 0;
boldCellPlus = [];
for (i = 0; i < Parties; i++) {
if (diffMandates[i] > 0) PlusCounter++;
}
if (PlusCounter === 0) {
alert(„След “ + Timer + “ повторения имаме резултат!“);
for (i = 0; i < Parties; i++) {
finalTable[i] = [];
for (j = 0; j < MIR; j++) {
finalTable[i][j] = bolded[i][j] + intMandates[i][j];
}
}
// Decoration is not copied
// …..
break;
}
// Article 24
var bBold = 0;
for (i = 0; i < Parties; i++) {
if (typeof colorIndex[i] === ‘undefined’) colorIndex[i] = [];
boldCellPlus[i] = [];
for (j = 0; j < MIR; j++) {
boldCellPlus[i][j] = 0;
if (bolded[i][j] && diffMandates[i] > 0 && colorIndex[i][j] !== 3) {
boldCellPlus[i][j] = 1; // Union
bBold = 1;
}
}
}
if (!bBold) {
alert(„Внимание, настъпи проблем след “ + Timer + “ повторения в стъпка 3! Не може да се намери решение: Моля информирайте ЦИК на cik@cik.bg“);
break;
}
var res = crossTableMinMax(fracMandates, boldCellPlus, 0);
Min = res.val;
Iplus = res.row;
Jplus = res.col;
cellMinus = [];
var bCell = 0;
for (k = 0; k < Parties; k++) {
cellMinus[k] = [];
if (bolded[k][Jplus] === 0 && colorIndex[k][Jplus] !== 3) {
cellMinus[k][Jplus] = 1;
bCell = 1;
}
}
if (bCell) {
res = crossTableMinMax(fracMandates, cellMinus, 1);
Iminus = res.row;
// var counter = Jplus; //???
bolded[Iplus][Jplus] = 0;
bolded[Iminus][Jplus] = 1; // fixed typo
colorIndex[Iplus][Jplus] = 3;
colorIndex[Iminus][Jplus] = 5;
for (i = 0; i < Parties; i++) {
diffMandates[i] = sumArray(bolded[i]) – parMandates[i];
}
} else {
for (i = 0; i < Parties; i++) colorIndex[i][Jplus] = 3; // red color according to art. 26
}
}
console.log(finalTable);
// Visualization need to happen here
var visual = document.getElementById(„outResults“);
var t = „“;
// –––– Visualize Table of fractions
var t3 = [];
t3[0] = [„“].concat(p.mir.map(function(n) {
return n.name;
})).concat([„Сборно“, „Спечелени“]);
t3[1] = [„Мандати за:“].concat(p.mir.map(function(n) {
return n.mandates;
})).concat([p.totalMandates, p.totalMandates]);
for (i = 0; i < mandates.length; i++) {
t3.push([p.party[i].partyName]);
for (j = 0; j < mandates[i].length; j++) t3[2 + i][1 + j] = mandates[i][j].toFixed(3);
}
for (i = 0; i < Parties; i++) {
t3[2 + i][1 + MIR] = globalMandates[i].toFixed(3);
t3[2 + i][2 + MIR] = winMandates[i];
}
t += „
“ + buildTable(t3, ‘table3’);
var t3i = [];
t3i[0] = [„“].concat(p.mir.map(function(n) {
return n.name;
})).concat([„Раздадени“, „Остават за раздаване“]);
for (i = 0; i < intMandates.length; i++) {
t3i.push([p.party[i].partyName].concat(intMandates[i]).concat([sumArray(intMandates[i]), winMandates[i] – sumArray(intMandates[i])]));
}
t += „
“ + buildTable(t3i, ‘table3i’);
var t3p = [];
t3p[0] = [„“].concat(p.mir.map(function(n) {
return n.name;
})).concat([„Раздадени“, „Спечелени“]);
for (i = 0; i < intMandates.length; i++) {
t3p.push([p.party[i].partyName].concat(tab4Mandates[i]).concat([tab4giveMandates[i], tab4wonMandates[i]]));
}
t += „
“ + buildTable(t3p, ‘table3p’);
// –––– Visualize the Frac table, we need to add the colours here
var t4 = [
[„“].concat(p.mir.map(function(n) {
return n.name;
})).concat([„“, „“]), [„“]
];
t4[1][1 + MIR] = „Остават“;
t4[1][2 + MIR] = „“;
for (i = 0; i < Parties; i++) {
t4[i + 2] = [p.party[i].partyName];
for (j = 0; j < MIR; j++) {
t4[i + 2][j + 1] = {
value: fracMandates[i][j].toFixed(3),
attr: []
};
if (bolded[i][j]) t4[i + 2][j + 1].attr.push(„bolded“);
try {
if (colorIndex[i][j]) t4[i + 2][j + 1].attr.push(„colorIndex“ + colorIndex[i][j]);
} catch (e) {};
}
t4[i + 2][MIR + 1] = sumArray(bolded[i]);
t4[i + 2][MIR + 2] = diffMandates[i];
}
for (j = 0; j < MIR; j++) t4[1][1 + j] = sumCol(bolded, j);
// –––– Visualize Table 5
var t5 = [];
t5[0] = [„“].concat(p.mir.map(function(n) {
return n.name;
})).concat(„Сборно“);
t5[1] = [„Мандати за:“];
var sum = 0;
for (i = 0; i < finalTable[0].length; i++) {
t5[1][1 + i] = sumCol(finalTable, i);
sum += t5[1][1 + i];
}
t5[1][i + 1] = sum;
for (i = 0; i < finalTable.length; i++) {
t5.push([p.party[i].partyName].concat(finalTable[i]).concat(sumArray(finalTable[i])));
}
t += „
“ + buildTable(t5, ‘finalTable’);
// –––– End of Table 5
visual.innerHTML = t;
}
function crossTableMinMax(t1, t2, max) {
var i;
var j;
var val = ‘x’;
var row;
var col;
for (i = 0; i < t2.length; i++) {
for (j = 0; j < t2[i].length; j++) {
if (!t2[i][j]) continue;
if (val === ‘x’ || (max ? (val < t1[i][j]) : (val > t1[i][j]))) {
val = t1[i][j];
row = i;
col = j;
}
}
}
return {
val: val,
row: row,
col: col
};
}
function rank(num, arr, order) { // Rank in row
var i;
var a = arr.slice(0); //copy array
a.sort().reverse(); // Sort the array
if (order) a.sort(); // Sort the array progresively
i = a.indexOf(num);
if (i >= 0) return i + 1;
return arr.length + 1;
}
function rankCol(num, arr, col, order) { // Rank in col
var i;
var a = [];
Disclaimer: This email and any attachments to it may contain confidential information. Any distribution or disclosure of the content is not allowed. If you are not intended to be an addressee of the email and you have received this email in error, please notify immediately the sender by return email and delete the email immediately from your system without copying or disclosing its content to any person.