|
|
|
@ -23,24 +23,26 @@ var defaultconfig = { |
|
|
|
|
"remotepath": ""//远程在线文件地址
|
|
|
|
|
} |
|
|
|
|
eval(fetch('hiker://files/cache/SrcSet.js'));//加载用户参数
|
|
|
|
|
if(!userconfig){var config = defaultconfig}else{var config = userconfig}//没有取到用户参数时调用默认参数
|
|
|
|
|
if(getMyVar('Stitle','0').indexOf("帅助手") == -1){config.testcheck=0} |
|
|
|
|
putMyVar('SrcM3U8',config.cachem3u8); |
|
|
|
|
if(!userconfig){var SAconfig = defaultconfig}else{var SAconfig = userconfig}//没有取到用户参数时调用默认参数
|
|
|
|
|
var testcheck = SAconfig.testcheck; |
|
|
|
|
var printlog = SAconfig.printlog; |
|
|
|
|
if(getMyVar('Stitle','0').indexOf("帅助手") == -1){testcheck=0} |
|
|
|
|
putMyVar('SrcM3U8',SAconfig.cachem3u8); |
|
|
|
|
|
|
|
|
|
//加载远程自定义设置
|
|
|
|
|
if(config.iscustom==1){ |
|
|
|
|
if(SAconfig.iscustom==1){ |
|
|
|
|
try{ |
|
|
|
|
let remotefile = fetchCache(config.remotepath, 24); |
|
|
|
|
let remotefile = fetchCache(SAconfig.remotepath, 24); |
|
|
|
|
if(remotefile.indexOf("ParseZ") != -1){ |
|
|
|
|
eval(remotefile); |
|
|
|
|
Object.assign(ParseS, ParseZ); |
|
|
|
|
}else{ |
|
|
|
|
if(config.printlog==1){log("√远程关怀自定义解析为空,走本地配置文件")}; |
|
|
|
|
config.iscustom = 0;
|
|
|
|
|
if(printlog==1){log("√远程关怀自定义解析为空,走本地配置文件")}; |
|
|
|
|
SAconfig.iscustom = 0;
|
|
|
|
|
} |
|
|
|
|
}catch(e){ |
|
|
|
|
if(config.printlog==1){log("√远程关怀自定义加载失败,走本地配置文件")}; |
|
|
|
|
config.iscustom = 0; |
|
|
|
|
if(printlog==1){log("√远程关怀自定义加载失败,走本地配置文件")}; |
|
|
|
|
SAconfig.iscustom = 0; |
|
|
|
|
} |
|
|
|
|
}else{var resetsort = 0}; |
|
|
|
|
|
|
|
|
@ -56,17 +58,17 @@ if (isresetsort==0){ |
|
|
|
|
|
|
|
|
|
//自动解析入口
|
|
|
|
|
var aytmParse = function (vipUrl,parseStr) { |
|
|
|
|
if(config.printlog==1){ |
|
|
|
|
if(printlog==1){ |
|
|
|
|
log("√影片地址:"+vipUrl); |
|
|
|
|
if(config.iscustom==1){log("√已开启远程关怀模式")};
|
|
|
|
|
if(SAconfig.iscustom==1){log("√已开启远程关怀模式")};
|
|
|
|
|
if(parseStr){ |
|
|
|
|
log("√指定解析>"+parseStr); |
|
|
|
|
}else{ |
|
|
|
|
if(config.autoselect==1){log("√开启智能优选")}else{log("√关闭智能优选")};
|
|
|
|
|
if(config.disorder==1){log("√开启乱序模式")}else{log("√关闭乱序模式")};
|
|
|
|
|
if(config.parsereserve==1){log("√开启强制优先断插配置")};
|
|
|
|
|
if(SAconfig.autoselect==1){log("√开启智能优选")}else{log("√关闭智能优选")};
|
|
|
|
|
if(SAconfig.disorder==1){log("√开启乱序模式")}else{log("√关闭乱序模式")};
|
|
|
|
|
if(SAconfig.parsereserve==1){log("√开启强制优先断插配置")};
|
|
|
|
|
} |
|
|
|
|
if(config.testcheck==1){log("√当前为检测模式")};
|
|
|
|
|
if(testcheck==1){log("√当前为检测模式")};
|
|
|
|
|
}; |
|
|
|
|
var str = ""; |
|
|
|
|
var from = ""; |
|
|
|
@ -135,12 +137,11 @@ var aytmParse = function (vipUrl,parseStr) { |
|
|
|
|
var prior = [];//处理用户手工配置项的临时数组
|
|
|
|
|
if (parseStr) { |
|
|
|
|
strlist = parseStr.split(/,|,/); //字符分割
|
|
|
|
|
//config.autoselect = 0;
|
|
|
|
|
}else{ |
|
|
|
|
//自动列出所有接口
|
|
|
|
|
var excludeParse = ['defaultParse', 'maoss', 'CityIP', 'cacheM3u8', 'pcUA', 'parseLc', 'gparse', 'nparse', '道长仓库通免', 'defaultParseWeb', '智能优选', '默认']; |
|
|
|
|
if(mySet.qju=="智能优选"){config.autoselect=1} |
|
|
|
|
if(config.autoselect==1){ |
|
|
|
|
if(mySet.qju=="智能优选"){SAconfig.autoselect=1} |
|
|
|
|
if(SAconfig.autoselect==1){ |
|
|
|
|
//全局排除的追加到排除列表
|
|
|
|
|
for(var j=0;j<sortlist.length;j++){ |
|
|
|
|
try{ |
|
|
|
@ -161,7 +162,7 @@ var aytmParse = function (vipUrl,parseStr) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
var parsetmplist = [];//用于取配置文件的解析口临时数组
|
|
|
|
|
if(config.iscustom==1){ |
|
|
|
|
if(SAconfig.iscustom==1){ |
|
|
|
|
//远程关怀模式只取在线解析接口
|
|
|
|
|
for( var key in ParseZ ){ |
|
|
|
|
if(excludeParse.indexOf(key)==-1 && prior.indexOf(key)==-1){ |
|
|
|
@ -176,7 +177,7 @@ var aytmParse = function (vipUrl,parseStr) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if(config.disorder==1){ |
|
|
|
|
if(SAconfig.disorder==1){ |
|
|
|
|
//乱序模式
|
|
|
|
|
function randArr (arr) { |
|
|
|
|
return arr.sort(() => { |
|
|
|
@ -202,7 +203,7 @@ var aytmParse = function (vipUrl,parseStr) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (strlist.length==0) {hideLoading();return 'toast://好像没有配置解析接口,解个寂寞吗';} |
|
|
|
|
if(config.printlog==1){ |
|
|
|
|
if(printlog==1){ |
|
|
|
|
log("√影片来源标识:"+from) |
|
|
|
|
log("√选择的解析接口组:"+strlist); |
|
|
|
|
}; |
|
|
|
@ -255,7 +256,7 @@ var aytmParse = function (vipUrl,parseStr) { |
|
|
|
|
}else{ |
|
|
|
|
if(sortlist[j].stopfrom.length > 0){ Object.assign(stopfrom, sortlist[j].stopfrom); }; |
|
|
|
|
} |
|
|
|
|
if(config.autoselect==1&&prior.includes(parsename)==true&&config.parsereserve==1){ |
|
|
|
|
if(SAconfig.autoselect==1&&prior.includes(parsename)==true&&SAconfig.parsereserve==1){ |
|
|
|
|
//开启了强制优先并保留用户配置的解析
|
|
|
|
|
sort = 0; |
|
|
|
|
stopfrom = []; |
|
|
|
@ -278,7 +279,7 @@ var aytmParse = function (vipUrl,parseStr) { |
|
|
|
|
if(dellist.indexOf(strlist[i])==-1){dellist.push(strlist[i])}; |
|
|
|
|
}else{ |
|
|
|
|
//解析接口存在
|
|
|
|
|
if(config.autoselect==1){ |
|
|
|
|
if(SAconfig.autoselect==1){ |
|
|
|
|
if(stopfrom.indexOf(from)==-1){ |
|
|
|
|
//自动筛选模式时,sort只做排序使用,不包含停用片源的解析,则加入解析接口组
|
|
|
|
|
if(parselx=="J"){ |
|
|
|
@ -292,13 +293,13 @@ var aytmParse = function (vipUrl,parseStr) { |
|
|
|
|
Uparsenum ++; |
|
|
|
|
} |
|
|
|
|
}else{ |
|
|
|
|
if(stopfrom.length>=config.fromcount&&stopfrom.indexOf(from)>-1){ |
|
|
|
|
if(stopfrom.length>=SAconfig.fromcount&&stopfrom.indexOf(from)>-1){ |
|
|
|
|
//此解析接口大于多少片源失败,且已排除片源,加入提示删除数组
|
|
|
|
|
dellist.push(strlist[i]); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}else{ |
|
|
|
|
if(sort>=config.failcount&&stopfrom.indexOf(from)>-1){ |
|
|
|
|
if(sort>=SAconfig.failcount&&stopfrom.indexOf(from)>-1){ |
|
|
|
|
//此接口已失败大于设置的次数,且已排除片源,加入提示删除数组
|
|
|
|
|
dellist.push(strlist[i]); |
|
|
|
|
}else{ |
|
|
|
@ -318,19 +319,19 @@ var aytmParse = function (vipUrl,parseStr) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if(dellist.length > 0){ |
|
|
|
|
config['dellist'] = dellist; |
|
|
|
|
writeFile("hiker://files/cache/SrcSet.js", 'var userconfig = ' + JSON.stringify(config)) |
|
|
|
|
if(config.printlog == 1){log("√建议删除解析口:"+dellist);} |
|
|
|
|
SAconfig['dellist'] = dellist; |
|
|
|
|
writeFile("hiker://files/cache/SrcSet.js", 'var userconfig = ' + JSON.stringify(SAconfig)) |
|
|
|
|
if(printlog == 1){log("√建议删除解析口:"+dellist);} |
|
|
|
|
} |
|
|
|
|
if(parselist.length == 0){ |
|
|
|
|
if(config.printlog==1){log("√没有可用的解析接口,需重新配置")}; |
|
|
|
|
if(printlog==1){log("√没有可用的解析接口,需重新配置")}; |
|
|
|
|
hideLoading(); |
|
|
|
|
return 'toast://√解析口全部无效了,重新配置吧'; |
|
|
|
|
}else{ |
|
|
|
|
//解析接口排序,将之前失败的排在后面
|
|
|
|
|
parselist.sort(sortData) |
|
|
|
|
} |
|
|
|
|
if(config.printlog==1){ |
|
|
|
|
if(printlog==1){ |
|
|
|
|
log("√断插有效解析数:"+parselist.length+" (J解析:"+Jparsenum+",U解析:"+Uparsenum+")"); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
@ -341,12 +342,12 @@ var aytmParse = function (vipUrl,parseStr) { |
|
|
|
|
var names = [];//用于多线路名称
|
|
|
|
|
var headers = [];//用于多线路头信息
|
|
|
|
|
var danmu = "";//多线路弹幕
|
|
|
|
|
var ismulti = config.ismulti||0;//是否开启多线程
|
|
|
|
|
var multiline = config.multiline||1;//多线程数量
|
|
|
|
|
var adminuser = config.adminuser||0; |
|
|
|
|
var ismulti = SAconfig.ismulti||0;//是否开启多线程
|
|
|
|
|
var multiline = SAconfig.multiline||1;//多线程数量
|
|
|
|
|
var adminuser = SAconfig.adminuser||0; |
|
|
|
|
|
|
|
|
|
if(ismulti==0&&adminuser==0){multiline=2}else{if(multiline>5){multiline=5}} |
|
|
|
|
if(config.testcheck==1){multiline=10} |
|
|
|
|
if(testcheck==1){multiline=10} |
|
|
|
|
|
|
|
|
|
//明码解析线程代码
|
|
|
|
|
var parsetask = function(obj) { |
|
|
|
@ -404,7 +405,7 @@ var aytmParse = function (vipUrl,parseStr) { |
|
|
|
|
} |
|
|
|
|
if(rurl){
|
|
|
|
|
if(/^toast/.test(rurl)){ |
|
|
|
|
if(config.printlog==1){log(obj.name+'>提示:'+rurl.replace('toast://',''))}; |
|
|
|
|
if(printlog==1){log(obj.name+'>提示:'+rurl.replace('toast://',''))}; |
|
|
|
|
rurl = ""; |
|
|
|
|
}else if(/^http/.test(rurl)&&SrcParseS.testvideourl(rurl,obj.name)==0){ |
|
|
|
|
//检测地址有效性
|
|
|
|
@ -418,7 +419,7 @@ var aytmParse = function (vipUrl,parseStr) { |
|
|
|
|
var sorttask = function(obj) { |
|
|
|
|
for(var j=0;j<sortlist.length;j++){ |
|
|
|
|
if(!parselist.some(item => item.name==sortlist[j].name)){
|
|
|
|
|
if(config.printlog==1){log(sortlist[j].name+'不存在,从sort文件中删除')} |
|
|
|
|
if(printlog==1){log(sortlist[j].name+'不存在,从sort文件中删除')} |
|
|
|
|
sortlist.splice(j,1); |
|
|
|
|
j = j - 1; |
|
|
|
|
} |
|
|
|
@ -426,7 +427,7 @@ var aytmParse = function (vipUrl,parseStr) { |
|
|
|
|
return obj; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
if(config.testcheck==1){showLoading('√解析列表,检测中')}; |
|
|
|
|
if(testcheck==1){showLoading('√解析列表,检测中')}; |
|
|
|
|
var cleansort = 0; |
|
|
|
|
for (var i=0;i<parselist.length;i++) { |
|
|
|
|
if(playurl){break;} |
|
|
|
@ -440,7 +441,7 @@ var aytmParse = function (vipUrl,parseStr) { |
|
|
|
|
JxList.push(parselist[s]); |
|
|
|
|
i=s; |
|
|
|
|
} |
|
|
|
|
if(cleansort==0&&!parseStr&&config.autoselect==1){ |
|
|
|
|
if(cleansort==0&&!parseStr&&SAconfig.autoselect==1){ |
|
|
|
|
cleansort = 1;//清理sort文件只调用一轮
|
|
|
|
|
JxList.push({lx:'cleansort'}); |
|
|
|
|
} |
|
|
|
@ -467,9 +468,9 @@ var aytmParse = function (vipUrl,parseStr) { |
|
|
|
|
obj.ids.push(id); |
|
|
|
|
obj.results.push(taskResult); |
|
|
|
|
obj.errors.push(error); |
|
|
|
|
if (ismulti!=1&&config.testcheck!=1&&contain.test(taskResult.rurl) && !exclude.test(taskResult.rurl)) { |
|
|
|
|
if (ismulti!=1&&testcheck!=1&&contain.test(taskResult.rurl) && !exclude.test(taskResult.rurl)) { |
|
|
|
|
//toast("我主动中断了");
|
|
|
|
|
if(config.printlog==1){log("√线程结束");} |
|
|
|
|
if(printlog==1){log("√线程结束");} |
|
|
|
|
return "break"; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -484,18 +485,18 @@ var aytmParse = function (vipUrl,parseStr) { |
|
|
|
|
for(let k in beids){ |
|
|
|
|
parsename = beids[k].split('|')[1]; |
|
|
|
|
parselx = beids[k].split('|')[0]; |
|
|
|
|
if(config.printlog==1){log("√"+ parsename + ">" + parselx + "解析结果检查")}; |
|
|
|
|
if(printlog==1){log("√"+ parsename + ">" + parselx + "解析结果检查")}; |
|
|
|
|
if(beerrors[k]==null){ |
|
|
|
|
parseurl = beresults[k].rurl; |
|
|
|
|
if(config.jstoweb==1&&parselx=="J"&&parseurl.search(/x5Rule|webRule/)>-1){ |
|
|
|
|
if(SAconfig.jstoweb==1&&parselx=="J"&&parseurl.search(/x5Rule|webRule/)>-1){ |
|
|
|
|
//js中跳转x5或web嗅探
|
|
|
|
|
if(config.printlog==1){log("√JS中跳转x5|web嗅探,解析逻辑被打断,结果自负")};
|
|
|
|
|
if(printlog==1){log("√JS中跳转x5|web嗅探,解析逻辑被打断,结果自负")};
|
|
|
|
|
return parseurl; |
|
|
|
|
}else{ |
|
|
|
|
if (contain.test(parseurl) && !exclude.test(parseurl)) { |
|
|
|
|
if(playurl==""){playurl = parseurl;} |
|
|
|
|
if(config.printlog==1){log("√"+parselx+"解析成功>" + parseurl)};
|
|
|
|
|
if(config.testcheck==1){ |
|
|
|
|
if(printlog==1){log("√"+parselx+"解析成功>" + parseurl)};
|
|
|
|
|
if(testcheck==1){ |
|
|
|
|
playurl = ""; |
|
|
|
|
}else{ |
|
|
|
|
if(ismulti==1&&multiline>1){ |
|
|
|
@ -553,7 +554,7 @@ var aytmParse = function (vipUrl,parseStr) { |
|
|
|
|
issort = 1; |
|
|
|
|
failsum = sortlist[j].sort; |
|
|
|
|
if(sortlist[j].stopfrom.indexOf(from)==-1){ |
|
|
|
|
if((config.autoselect==1&&failsum>=3)||(failsum>=config.failcount)){ |
|
|
|
|
if((SAconfig.autoselect==1&&failsum>=3)||(failsum>=SAconfig.failcount)){ |
|
|
|
|
//自动选择接口时此接口失败大于等于3时、失败次数大于限定,此片源排除此解析接口
|
|
|
|
|
sortlist[j].stopfrom[sortlist[j].stopfrom.length] = from |
|
|
|
|
}; |
|
|
|
@ -561,14 +562,14 @@ var aytmParse = function (vipUrl,parseStr) { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if(config.testcheck==1){faillist.push(parsename)}; |
|
|
|
|
if(config.printlog==1){log("√解析失败,已失败"+failsum+"次,跳过")};
|
|
|
|
|
if(testcheck==1){faillist.push(parsename)}; |
|
|
|
|
if(printlog==1){log("√解析失败,已失败"+failsum+"次,跳过")};
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}else{ |
|
|
|
|
if(config.testcheck==1){faillist.push(parsename)}; |
|
|
|
|
if(config.printlog==1){log(beerrors[k]+" √此解析有语法错误,跳过")}; |
|
|
|
|
if(testcheck==1){faillist.push(parsename)}; |
|
|
|
|
if(printlog==1){log(beerrors[k]+" √此解析有语法错误,跳过")}; |
|
|
|
|
for(var j=0;j<sortlist.length;j++){ |
|
|
|
|
if(sortlist[j].name == parsename){
|
|
|
|
|
sortlist[j].sort = sortlist[j].sort+1; |
|
|
|
@ -600,8 +601,8 @@ var aytmParse = function (vipUrl,parseStr) { |
|
|
|
|
uniq(faillist);//去除重复
|
|
|
|
|
if (x5jxlist.length == 0) { |
|
|
|
|
hideLoading(); |
|
|
|
|
if(config.printlog==1){ |
|
|
|
|
if(config.testcheck==1){ |
|
|
|
|
if(printlog==1){ |
|
|
|
|
if(testcheck==1){ |
|
|
|
|
log('√检测结束'); |
|
|
|
|
log('√解析失败的>'+faillist); |
|
|
|
|
refreshPage(false); |
|
|
|
@ -609,7 +610,7 @@ var aytmParse = function (vipUrl,parseStr) { |
|
|
|
|
log('√JS免嗅和URL明码接口失败、网页嗅探未取到解析口,需重新配置插件') |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
if(config.testcheck==1){ |
|
|
|
|
if(testcheck==1){ |
|
|
|
|
if (parseStr == undefined) { |
|
|
|
|
if(faillist.length>0){ |
|
|
|
|
return $("检测结束,是否处理失败的解析?").confirm((faillist,helper)=>{ |
|
|
|
@ -630,15 +631,15 @@ var aytmParse = function (vipUrl,parseStr) { |
|
|
|
|
return "toast://未找到可用的解析口" |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
if(config.printlog==1){if(config.testcheck==1){log("√JS免嗅和URL明码检测结束,转网页嗅探检测接口数:"+x5jxlist.length)}else{log("√JS免嗅和URL明码失败,转网页嗅探解析接口数:"+x5jxlist.length)}}; |
|
|
|
|
if(config.printlog==1){log("√嗅探调用解析口:"+x5nmlist[0])}; |
|
|
|
|
if(config.testcheck==1){showLoading('嗅探解析列表,检测中')}else{showLoading('√嗅探解析中,请稍候')}; |
|
|
|
|
let parmset = {"issort":0,"printlog":config.printlog,"timeout":config.x5timeout,"autoselect":config.autoselect,"failcount":config.failcount,"from":from,"testcheck":config.testcheck,"parseStr":parseStr,"helper":getMyVar('helper','0'),"Sversion":parseInt(getMyVar('Sversion','0'))}; |
|
|
|
|
if(printlog==1){if(testcheck==1){log("√JS免嗅和URL明码检测结束,转网页嗅探检测接口数:"+x5jxlist.length)}else{log("√JS免嗅和URL明码失败,转网页嗅探解析接口数:"+x5jxlist.length)}}; |
|
|
|
|
if(printlog==1){log("√嗅探调用解析口:"+x5nmlist[0])}; |
|
|
|
|
if(testcheck==1){showLoading('嗅探解析列表,检测中')}else{showLoading('√嗅探解析中,请稍候')}; |
|
|
|
|
let parmset = {"issort":0,"printlog":printlog,"timeout":SAconfig.x5timeout,"autoselect":SAconfig.autoselect,"failcount":SAconfig.failcount,"from":from,"testcheck":testcheck,"parseStr":parseStr,"helper":getMyVar('helper','0'),"Sversion":parseInt(getMyVar('Sversion','0'))}; |
|
|
|
|
for(var i = 0; i < x5nmlist.length; i++) { |
|
|
|
|
faillist.push(x5nmlist[i]); |
|
|
|
|
} |
|
|
|
|
config['x5scslist'] = []; |
|
|
|
|
writeFile("hiker://files/cache/SrcSet.js", 'var userconfig = ' + JSON.stringify(config)); |
|
|
|
|
SAconfig['x5scslist'] = []; |
|
|
|
|
writeFile("hiker://files/cache/SrcSet.js", 'var userconfig = ' + JSON.stringify(SAconfig)); |
|
|
|
|
return x5Player(x5jxlist,x5nmlist,vipUrl,sortlist,parmset,faillist,SrcParseS.formatUrl); |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
@ -654,14 +655,14 @@ var aytmParse = function (vipUrl,parseStr) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} catch (e) { |
|
|
|
|
if(config.printlog==1){log("√语法错误")}; |
|
|
|
|
if(printlog==1){log("√语法错误")}; |
|
|
|
|
return 'toast://解析失败,语法错误'; |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
//x5嗅探通用免嗅函数、自动多层嵌套
|
|
|
|
|
function x5Player(x5jxlist, x5nmlist, vipUrl, sortlist, parmset, faillist, formatUrl) { |
|
|
|
|
return 'x5Rule://' + x5jxlist[0] + vipUrl + '@' + (typeof $$$ == 'undefined' ? $ : $$$).toString((x5jxlist, x5nmlist, vipUrl, sortlist, parmset, faillist, formatUrl, x5Player) => { |
|
|
|
|
return 'webRule://' + x5jxlist[0] + vipUrl + '@' + (typeof $$$ == 'undefined' ? $ : $$$).toString((x5jxlist, x5nmlist, vipUrl, sortlist, parmset, faillist, formatUrl, x5Player) => { |
|
|
|
|
if(typeof(request)=='undefined'||!request){ |
|
|
|
|
eval(fba.getInternalJs()); |
|
|
|
|
}; |
|
|
|
|