feat: add makecookie must handler functions

This commit is contained in:
rnet 2023-12-25 01:03:26 +08:00
parent c3204f6509
commit cc899698f8
21 changed files with 538 additions and 143 deletions

View File

@ -1,154 +1,17 @@
const dataOper = require('./dataOper');
const _chunk = require('lodash/chunk');
const jsdom = require("jsdom");
const { JSDOM } = jsdom;
const { window } = new JSDOM(``, {
runScripts: "outside-only",
url: "http://wcjs.sbj.cnipa.gov.cn/sgtmi",
});
const { String, Array, Error, Math, Date, Object, unescape, encodeURIComponent, Function, parseInt } = window;
const parser = require('./parser/');
const gv = require('./globalVarible');
module.exports = class {
constructor(ts) {
this.startTime = new Date().getTime();
window.$_ts = ts
this.opdata = dataOper()
parser.init(ts)
}
parseCpCommon(data) {
if (!data) return [];
const { opdata: { getData } } = this;
const ans = []
const firstCode = data.charCodeAt(0) - 97;
for (let idx = 1; idx < data.length; ++idx) {
let curr = data.charCodeAt(idx);
if (curr >= 40 && curr < 92) {
curr += firstCode;
if (curr >= 92) curr -= 52;
} else if (curr >= 97 && curr < 127) {
curr += firstCode;
if(curr >= 127) curr -= 30;
}
ans[idx - 1] = curr;
}
return String.fromCharCode(...ans).split(getData('G_$d2'));
}
globalCode() {
const { opdata: { setData, getData } } = this;
setData('G_$dZ', String.fromCharCode);
setData('G_$at', Array);
setData('G_$d2', String.fromCharCode(96));
const cp0 = _chunk(this.parseCpCommon(window.$_ts.cp[0]), 96);
setData('G_$cc', cp0[0]);
setData('G_$ia', cp0[1]);
setData('G_$ga', cp0[2]);
setData('G_$_7', cp0[3]);
setData('G_$_3', cp0[4]);
setData('G_$jY', cp0[5]);
setData('G_$ad', cp0[6]);
setData('G_$bJ', cp0[7]);
setData('G_$eh', cp0[8]);
setData('G_$bv', cp0[9]);
setData('G_$bO', cp0[10]);
setData('G_$_x', cp0[11]);
setData('G_$dL', cp0[12]);
setData('G_$bn', cp0[13]);
setData('G_$_a', cp0[14]);
setData('G_$kf', cp0[15]);
setData('G_$fa', cp0[16]);
setData('G_$h2', cp0[17]);
setData('G_$je', cp0[18]);
setData('G_$he', cp0[19]);
setData('G_$$6', cp0[20]);
setData('G_$hQ', this.parseCpCommon(window.$_ts.cp[2]).map(Number));
setData('G_$cJ', this.parseCpCommon(window.$_ts.cp[6]));
setData('G_$aP', []);
setData('G_$fX', []);
getData('G_$fX')[49] = getData('G_$aP');
getData('G_$fX')[15] = null;
setData('G_$cZ', String);
setData('G_$gc', window);
setData('G_$ja', null);
setData('G_$dq', Error);
setData('G_$cm', Math);
setData('G_$hY', parseInt);
setData('G_$ao', Date);
setData('G_$fi', Object);
setData('G_$aB', unescape);
setData('G_$hq', encodeURIComponent);
setData('G_$_z', Function);
setData('G_$ah', window.document);
setData('G_$ii', window.top.location);
setData('G_$_v', Math.random);
setData('G_$gh', Math.abs);
setData('G_$kg', Math.ceil);
getData('G_$fX')[51] = Math.round;
getData('G_$fX')[27] = Math.floor;
getData('G_$fX')[44] = Math.log;
getData('G_$fX')[53] = Math.pow;
setData('G_$bB', Math.sqrt);
setData('G_$fA', window.setTimeout);
setData('G_$iu', window.setInterval);
setData('G_$hL', window.eval);
setData('G_$dN', window.escape);
setData('G_$jr', window.Number);
setData('G_$gL', window.decodeURIComponent);
setData('G_$dk', window.isFinite);
setData('G_$c7', window.location);
setData('G_$jU', window.RegExp);
getData('G_$fX')[19] = window.$_ts;
setData('G_$hD', String.prototype);
getData('G_$fX')[40] = String.prototype.charAt;
setData('G_$jD', String.prototype.charCodeAt);
getData('G_$fX')[30] = String.prototype.concat;
getData('G_$fX')[14] = String.prototype.indexOf;
getData('G_$fX')[33] = String.prototype.lastIndexOf;
setData('G_$gW', String.prototype.match);
setData('G_$en', String.prototype.replace);
setData('G_$$L', String.prototype.search);
getData('G_$fX')[36] = String.prototype.slice;
getData('G_$fX')[11] = String.prototype.split;
setData('G_$j0', String.prototype.substr);
setData('G_$c1', String.prototype.substring);
getData('G_$fX')[42] = String.prototype.toLowerCase;
getData('G_$fX')[43] = String.prototype.toUpperCase;
setData('G_$f9', Array.prototype.push);
setData('G_$in', Object.prototype.toString);
getData('G_$fX')[38] = Function.prototype.toString;
getData('G_$fX')[2] = Array.prototype.join;
getData('G_$fX')[16] = window.document.createElement;
getData('G_$fX')[21] = window.document.appendChild;
getData('G_$fX')[50] = window.document.removeChild;
setData('G_$eF', []);
getData('G_$fX')[46] = window.clearInterval;
setData('G_$bd', '/');
setData('G_$eD', ':');
setData('G_$dl', '#');
setData('G_$bL', '//');
setData('G_$cb', 'href');
setData('G_$ap', 'protocol');
setData('G_$_f', 'hostname');
setData('G_$jm', 'port');
setData('G_$jQ', 'pathname');
setData('G_$dH', window.CollectGarbage);
getData('G_$fX')[32] = window.DOMParser
setData('G_$_E', window.ActiveXObject);
setData('G_$aJ', window.JSON);
setData('G_$$H', String.prototype.trim);
getData('G_$fX')[45] = window.JSON && window.JSON.parse;
getData('G_$fX')[52] = '';
getData('G_$fX')[48] = window.$_ts.jf;
window.$_ts.jf = undefined;
getData('G_$fX')[12] = [getData('G_$hQ')[9], getData('G_$hQ')[48], getData('G_$hQ')[37], 1];
getData('G_$fX')[3] = 1;
getData('G_$fX')[18] = getData('G_$hQ')[41];
getData('G_$fX')[8] = getData('G_$hQ')[0];
setData('G_$$o', parseInt);
parseHandle() {
}
run() {
this.globalCode();
this.parseHandle();
}
}

29
src/handler/funcOper.js Normal file
View File

@ -0,0 +1,29 @@
module.exports = function() {
let data;
function init(defData = {}) {
data = { ...defData };
}
init();
return {
setFunc(key, val, isNotCover = false) {
if (key.indexOf('G_') === 0) isNotCover = true;
if (isNotCover && key in data) throw Error(`数据键${key}重复定义`);
data[key] = val;
return val;
},
getFunc(key, automake = false) {
if (!(key in data)) {
if (automake) {
data[key] = () => key;
} else {
throw Error(`数据键${key}未定义`);
}
}
return data[key]
},
getAllFunc() {
return data;
},
init,
}
}

View File

@ -0,0 +1,46 @@
const _merge = require('lodash/merge');
const _chunk = require('lodash/chunk');
const _get = require('lodash/get');
const cache = {};
class GlobalVarible {
get cp0() {
return cache.cp0;
}
get cp0_96() {
return (idx, cur) => {
const isIdxNum = typeof idx === 'number';
const isCurNum = typeof cur === 'number';
if (isIdxNum && isCurNum) return _get(cache, `cp0_96.${idx}.${cur}`);
if (isIdxNum) return _get(cache, `cp0_96.${idx}`);
return cache.cp0_96
}
}
get cp2() {
return cache.cp2;
}
get cp6() {
return cache.cp6;
}
get ts() {
// 返回$_ts
return cache.ts;
}
get r2mka() {
// 返回获取任务对象的方法,为空时返回任务树
return cache.r2mka;
}
get keys() {
// 返回密钥集合
return cache.keys;
}
setAttr(attr, value) {
cache[attr] = value;
if (attr === 'cp0') {
cache.cp0_96 = _chunk(value, 96);
}
}
}
module.exports = new GlobalVarible();

View File

@ -0,0 +1,12 @@
// 将数字数组每四位通过位移运算生成新数字,最后组成数组返回
// 入参数组的长度必须是4的倍数
const gv = require('@src/handler/globalVarible');
module.exports = function(numarr) {
const arr = new Array(numarr.length / gv.cp2[19]);
for (let cursor = 0, idx = 0; cursor < numarr.length; cursor += 4, idx++) {
arr[idx] = numarr[cursor] << gv.cp2[4] | numarr[cursor + 1] << gv.cp2[2] | numarr[cursor + 2] << gv.cp2[52] | numarr[cursor + 3];
}
return arr;
}

View File

@ -0,0 +1,55 @@
const gv = require('@src/handler/globalVarible');
function trans(numarr) {
const ans = [];
const mark = '?'.charCodeAt();
for (var idx = 0; idx < numarr.length; idx++) {
const num = numarr[idx];
let val;
if (num < gv.cp2[37]) {
val = num;
} else if (num < gv.cp2[46]) {
val = mark;
} else if (num < gv.cp2[36]) {
val = (num & gv.cp2[13]) << gv.cp2[55] | numarr[idx + 1] & gv.cp2[13];
idx++;
} else if (num < gv.cp2[7]) {
val = (num & gv.cp2[31]) << gv.cp2[14] | (numarr[idx + 1] & gv.cp2[13]) << gv.cp2[55] | numarr[idx + gv.cp2[56]] & gv.cp2[13];
idx += gv.cp2[56];
} else if (num < gv.cp2[99]) {
val = (num & gv.cp2[23]) << gv.cp2[9] | (numarr[idx + 1] & gv.cp2[13]) << gv.cp2[14] | (numarr[idx + gv.cp2[56]] & gv.cp2[13]) << gv.cp2[55] | numarr[idx + gv.cp2[58]] & gv.cp2[13];
idx += gv.cp2[58];
} else if (num < gv.cp2[148]) {
val = mark;
idx += gv.cp2[19];
} else if (num < gv.cp2[171]) {
val = mark;
idx += gv.cp2[29];
} else {
val = mark;
}
if (val > gv.cp2[25]) {
val -= gv.cp2[26];
ans.push((val >> gv.cp2[0]) + gv.cp2[187], val % gv.cp2[63] + gv.cp2[160]);
} else {
ans.push(val);
}
}
return ans;
}
function join(numarr, start = 0, end = numarr.length) {
const ans = new Array(Math.ceil(numarr.length / gv.cp2[120]));
let idx = 0;
while (start < end - gv.cp2[120]) {
ans[idx++] = String.fromCharCode(...numarr.slice(start, start += gv.cp2[120]));
}
if (start < end) {
ans[idx++] = String.fromCharCode(...numarr.slice(start, end));
}
return ans.join('');
}
module.exports = function(numarr) {
return join(trans(numarr));
}

View File

@ -0,0 +1,30 @@
const gv = require('@src/handler/globalVarible');
let datas = undefined;
module.exports = function(str) {
if (!datas) {
datas = gv.cp0_96(7, 41).split('').reduce((ans, key, idx) => {
const code = key.charCodeAt()
ans[0][code] = idx << gv.cp2[56];
ans[1][code] = idx >> gv.cp2[19];
ans[2][code] = (idx & gv.cp2[31]) << gv.cp2[19];
ans[3][code] = idx >> gv.cp2[56];
ans[4][code] = (idx & gv.cp2[58]) << gv.cp2[55];
ans[5][code] = idx;
return ans
}, [{}, {}, {}, {}, {}, { ...new Array(255).fill(-1) }])
}
const [data1, data2, data3, data4, data5, data6] = datas;
const ans = []
for(let i = 0; i < str.length; i += 4) {
let [one, two, three, four] = [0, 1, 2, 3].map(it => {
if (i + it >= str.length) return undefined
return str[i + it].charCodeAt()
})
two !== undefined && ans.push(data1[one] | data2[two])
three !== undefined && ans.push(data3[two] | data4[three])
four !== undefined && ans.push(data5[three] | data6[four])
}
return ans
}

View File

@ -0,0 +1,37 @@
// 加密两个数组生成新数组
const combine4 = require('./combine4');
const gv = require('@src/handler/globalVarible');
module.exports = function (numarr1, numarr2) {
const arr = new Array(numarr1.length - gv.cp2[52]);
const comb1 = combine4(numarr1);
const comb2 = combine4(numarr2);
let first = comb1[0];
let second = comb1[1];
let current, next, temp;
let cursor = 0;
for (let idx = gv.cp2[56]; idx < comb1.length - 1; cursor += 8, idx += 2) {
current = comb1[idx];
next = comb1[idx + 1];
temp = gv.cp2[132];
for (let i = 0; i < gv.cp2[48]; ++i) {
next = next - ((current << gv.cp2[19] ^ current >> gv.cp2[29] & gv.cp2[12]) + current ^ temp + comb2[temp >> gv.cp2[57] & gv.cp2[105] & gv.cp2[58]]) & gv.cp2[17];
temp = temp - gv.cp2[66] & gv.cp2[17];
current = current - ((next << gv.cp2[19] ^ next >> gv.cp2[29] & gv.cp2[12]) + next ^ temp + comb2[temp & gv.cp2[58]]) & gv.cp2[17];
}
first = current ^ first;
second = next ^ second;
arr[cursor] = first >> gv.cp2[4] & gv.cp2[34];
arr[cursor + 1] = first >> gv.cp2[2] & gv.cp2[34];
arr[cursor + 2] = first >> gv.cp2[52] & gv.cp2[34];
arr[cursor + 3] = first & gv.cp2[34];
arr[cursor + 4] = second >> gv.cp2[4] & gv.cp2[34];
arr[cursor + 5] = second >> gv.cp2[2] & gv.cp2[34];
arr[cursor + 6] = second >> gv.cp2[52] & gv.cp2[34];
arr[cursor + 7] = second & gv.cp2[34];
first = comb1[idx];
second = comb1[idx + 1];
}
arr.splice(cursor - arr[cursor - 1], arr[cursor - 1]);
return arr;
}

View File

@ -0,0 +1,26 @@
// 数组中提取数据
const gv = require('@src/handler/globalVarible');
function getLens(numarr, idx) {
const item = numarr[idx];
if ((item & gv.cp2[37]) === 0) return item;
if ((item & gv.cp2[46]) == gv.cp2[37]) return (item & gv.cp2[13]) << gv.cp2[52] | numarr[idx + 1];
if ((item & gv.cp2[36]) == gv.cp2[46]) return (item & gv.cp2[1]) << gv.cp2[2] | numarr[idx + 1] << gv.cp2[52] | numarr[idx + 2];
if ((item & gv.cp2[7]) == gv.cp2[36]) return (item & gv.cp2[31]) << gv.cp2[4] | numarr[idx + 1] << gv.cp2[2] | numarr[idx + 2] << gv.cp2[52] | numarr[idx + 3];
if ((item & gv.cp2[99]) == gv.cp2[7]) return (numarr[idx + 1] << gv.cp2[4] | numarr[idx + 2] << gv.cp2[2] | numarr[idx + 3] << gv.cp2[52] | numarr[idx + 4]) >>> 0;
return item;
}
module.exports = function (numarr) {
const arr = [];
for(let i = 1; i < numarr.length; i++) {
const len = getLens(numarr, i);
if (len === 0) {
arr.push([]);
} else {
arr.push(numarr.slice(i + 1, i + 1 + len));
i += len;
}
}
return arr;
}

View File

@ -0,0 +1,8 @@
// 16进制数组拼接的数字转字符
module.exports = function(str) {
const arr = [];
for (let i = 0; i < str.length; i += 2) {
arr.push(parseInt(str.substr(i, 2), 16));
}
return String.fromCharCode(...arr);
}

View File

@ -0,0 +1,9 @@
exports.main = require('./main');
exports.swap = require('./swap');
exports.hexnum = require('./hexnum');
exports.combine4 = require('./combine4');
exports.encrypt = require('./encrypt');
exports.decrypt = require('./decrypt');
exports.extrace = require('./extrace');
exports.decode = require('./decode');

View File

@ -0,0 +1,19 @@
// 将字符串解码成字符数组
module.exports = function(str) {
if (!str) return [];
const splitStr = String.fromCharCode(96);
const ans = []
const firstCode = str.charCodeAt(0) - 97;
for (let idx = 1; idx < str.length; ++idx) {
let curr = str.charCodeAt(idx);
if (curr >= 40 && curr < 92) {
curr += firstCode;
if (curr >= 92) curr -= 52;
} else if (curr >= 97 && curr < 127) {
curr += firstCode;
if(curr >= 127) curr -= 30;
}
ans[idx - 1] = curr;
}
return String.fromCharCode(...ans).split(splitStr);
}

View File

@ -0,0 +1,10 @@
// 字符交换方式解码字符串
module.exports = function (str) {
const arr = str.split('');
for (let idx = str.length - 4; idx >= 0; idx -= 4) {
[arr[idx], arr[idx + 1], arr[idx + 3], arr[idx + 2]] =
[arr[idx + 1], arr[idx + 3], arr[idx + 2], arr[idx]];
}
return arr.join('');
}

View File

@ -0,0 +1,14 @@
// 用于将ascii码数组转字符后拼接
const gv = require('../globalVarible');
module.exports = function (numarr, start = 0, end = numarr.length) {
const arr = new Array(Math.ceil(numarr.length / gv.cp2[120]));
const idx = 0;
while (start < end - gv.cp2[120]) {
arr[idx++] = String.fromCharCode(...numarr.slice(start, start += gv.cp2[120]));
}
if (start < end) {
arr[idx++] = String.fromCharCode(...numarr.slice(start, end));
}
return arr.join('')
}

View File

@ -0,0 +1,32 @@
const gv = require('../globalVarible');
const getTimeFlag = (time) => {
return [
time >>> gv.cp2[4] & gv.cp2[34],
time >>> gv.cp2[2] & gv.cp2[34],
time >>> gv.cp2[52] & gv.cp2[34],
time & gv.cp2[34]
];
}
const restoreTimeFlag = (timeFlag) => {
return timeFlag[0] << gv.cp2[4] | timeFlag[1] << gv.cp2[2] | timeFlag[2] << gv.cp2[52] | timeFlag[3];
}
exports.parse = function(numarr) {
const now = Math.ceil(new Date().getTime() / 1000);
const timeflag = [
now >>> gv.cp2[4] & gv.cp2[34],
now >>> gv.cp2[2] & gv.cp2[34],
now >>> gv.cp2[52] & gv.cp2[34],
now & gv.cp2[34]
];
const random = Math.ceil(Math.random() * gv.cp2[30]);
const ans = [...numarr, ...timeflag].map(it => it ^ 33)
ans.push(random);
return ans
}
exports.init = function() {
};

View File

@ -0,0 +1,15 @@
const gv = require('../globalVarible');
const common = require('./common');
function init(ts) {
gv.setAttr('ts', ts);
require('./r2mka').init();
require('./tscp').init();
require('./tscd').init();
}
module.exports = {
...common,
init,
}

View File

@ -0,0 +1,88 @@
const gv = require('../globalVarible');
const gt3 = require('@src/immutext/').globalText3;
function gtHandler(str, curr) {
return {
getCurr: function() {
return curr;
},
getCode: function() {
return str.charCodeAt(curr++);
},
getLine: function() {
const end = this.getCode();
if (end === 0) return '';
const ans = str.substr(curr, end);
curr += end;
return ans;
},
getList: function() {
const ans = this.getLine()
if (!ans) return [];
return ans.split(String.fromCharCode(255));
},
}
}
const parse = (() => {
let count = 0;
const valMap = {};
return function(val, deep = 0, deeps = [0]) {
const str = val.taskstr;
val.taskstr = str;
val.val = {};
if (!str) {
val.taskarr = [];
} else {
val.taskarr = str.split('').map(it => it.charCodeAt());
}
val.key = `${deeps.join('>')}-${count++}`;
valMap[val.key] = val;
val.child_one.map((it, idx) => {
if (it) {
parse(it, deep + 1, [...deeps, 'one', idx]);
}
});
val.child_two.map((it, idx) => {
if (it) {
parse(it, deep + 1, [...deeps, 'two', idx]);
}
});
return (key) => {
if (!key) return val;
return valMap[key];
}
}
})();
exports.parse = function(str = gt3) {
const r2mka_len = 'r2mka'.length;
const flag = str.charAt(r2mka_len) === '1';
const gt = gtHandler(str, r2mka_len + 1);
function deepParse() {
const ans = {
lens: gt.getCode(), // 当isReset为否时或者循环开始入口设置入参数组的长度
isReset: gt.getCode(), // 标志位,标记是否重置循环参数
taskstr: gt.getLine(), // 循环的下标取值来源
}
let curr = gt.getCode();
ans.child_one = new Array(curr + 2);
for (let i = 0; i < curr; i++) {
ans.child_one[i + 2] = deepParse();
}
curr = gt.getCode();
ans.child_two = new Array(curr);
for (let i = 0; i < curr; i++) {
ans.child_two[i] = deepParse();
}
return ans;
}
gt.getList().concat(gt.getList()); // 未发现用处
const windowIdx = gt.getCode(); // 首次循环入参配置window变量存储下标
const resourceIdx = gt.getCode(); // 首次循环如参配置,资源变量存储下标
return parse(deepParse());
};
exports.init = function() {
gv.setAttr('r2mka', exports.parse(gt3));
}

View File

@ -0,0 +1,21 @@
// 生成密钥
const gv = require('../globalVarible');
const decrypt = require('./common/decrypt');
exports.init = function() {
const cdArr = decrypt(gv.ts.cd);
const start = gv.r2mka('0>one>23-25').taskarr[9] + 2;
const end = (cdArr[0] << 8 | cdArr[1]) + 2;
const one = cdArr.slice(start, end); // arr127
const offset = [1, 153, 3, 3, 4, 2, 6, 4];
const ans = cdArr.slice(end).map((item, idx) => { // arr1575
return item ^ offset[idx % gv.cp2[52]];
})
const keys = []
for (let i = 0, op = 1; i < ans[0]; i ++) {
const gap = ans[op++] << 8 | ans[op++];
keys.push(ans.slice(op, op + gap));
op += gap;
}
gv.setAttr('keys', keys);
};

View File

@ -0,0 +1,9 @@
// 将加密的字符串解密并切割成数组
const gv = require('../globalVarible');
const parse = require('./common/main');
exports.init = function() {
gv.setAttr('cp0', parse(gv.ts.cp[0]));
gv.setAttr('cp2', parse(gv.ts.cp[2]).map(Number));
gv.setAttr('cp6', parse(gv.ts.cp[6]));
}

File diff suppressed because one or more lines are too long

35
test/cp0_96.test.js Normal file
View File

@ -0,0 +1,35 @@
const paths = require('@utils/paths');
const fs = require('fs');
const { main, swap, hexnum, init } = require('../src/handler/parser/');
const tsFullPath = paths.exampleResolve('codes', '1-$_ts-full.json');
init(JSON.parse(fs.readFileSync(tsFullPath, 'utf8')));
const gv = require('@src/handler/globalVarible');
/*
setData('G_$cc', cp0[0]);
setData('G_$ia', cp0[1]);
setData('G_$ga', cp0[2]);
setData('G_$_7', cp0[3]);
setData('G_$_3', cp0[4]);
setData('G_$jY', cp0[5]);
setData('G_$ad', cp0[6]);
setData('G_$bJ', cp0[7]);
setData('G_$eh', cp0[8]);
setData('G_$bv', cp0[9]);
setData('G_$bO', cp0[10]);
setData('G_$_x', cp0[11]);
setData('G_$dL', cp0[12]);
setData('G_$bn', cp0[13]);
*/
const valueMap = {
'visibilityState': main(gv.cp0_96(6, 69)).join(),
'parseFloat': swap(gv.cp0_96(5, 18)) + hexnum(gv.cp0_96(8, 30)),
'11.678': hexnum(gv.cp0_96(7, 17)),
'1.234': swap(gv.cp0_96(8, 36)),
}
test('test cp0_96', () => {
Object.entries(valueMap).forEach(([tb, ex]) => {
expect(tb).toBe(ex);
})
});

35
test/parser.test.js Normal file
View File

@ -0,0 +1,35 @@
const paths = require('@utils/paths');
const fs = require('fs');
const { main, swap, hexnum, combine4, decrypt, encrypt, extrace, init, decode } = require('../src/handler/parser/');
const tsFullPath = paths.exampleResolve('codes', '1-$_ts-full.json');
init(JSON.parse(fs.readFileSync(tsFullPath, 'utf8')));
const gv = require('@src/handler/globalVarible');
describe('test parser common', () => {
test('test main', () => {
expect(main('inakaxadalqKlwl{')[0]).toBe('visibilityState');
});
test('test swap', () => {
expect(swap('rpsa')).toBe('pars');
});
test('test hexnum', () => {
expect(hexnum('65466c6f6174')).toBe('eFloat');
});
test('test combine4', () => {
expect(combine4(gv.keys[17])).toEqual([1052594159, -1469862260, 26804995, 67241476]);
});
test('test decrypt', () => {
expect(decrypt('GGZGPQnkMJBUeWs2sLstGIr6oLYDI3AX')).toEqual([130, 15, 32, 137, 204, 131, 108, 219, 215, 244, 196, 229, 78, 132, 202, 129, 240, 119, 30, 133, 70, 125, 132, 46]);
});
test('test encrypt', () => {
expect(encrypt(decrypt('GGZGPQnkMJBUeWs2sLstGIr6oLYDI3AX'), gv.keys[17])).toEqual([7, 0, 0, 6, 47, 115, 103, 116, 109, 105, 0, 0, 0, 0]);
});
test('test extrace', () => {
const arr = encrypt(decrypt('GGZGPQnkMJBUeWs2sLstGIr6oLYDI3AX'), gv.keys[17]);
expect(extrace(arr)).toEqual([[], [], [47, 115, 103, 116, 109, 105], [], [], [], []]);
});
test('test extrace', () => {
const arr = extrace(encrypt(decrypt('GGZGPQnkMJBUeWs2sLstGIr6oLYDI3AX'), gv.keys[17]));
expect(decode(arr[2])).toBe('/sgtmi');
});
});